А.В. Столяров - Введение в операционные системы (1152218), страница 37
Текст из файла (страница 37)
Çàìåòèì òåïåðü, ÷òî, äàæå åñëè èç äâóõ îäíîâðåìåííî îñóùåñòâëÿþùèõ äîñòóïïðîöåññîâ îäèí òîëüêî ÷èòàåò äàííûå, à ìîäèôèêàöèåé çàíèìàåòñÿ òîëüêîâòîðîé, ýòî âñå ðàâíî ìîæåò ïðèâåñòè ê ñèòóàöèè ãîíîê, êàê ìû óæå âèäåëèâ ïðèìåðå ñ ïîäñ÷åòîì îñòàòêîâ äåíåã íà áàíêîâñêèõ ñ÷åòàõ (ñì. ñòð. 149). òî æå âðåìÿ ïðîöåññû, îñóùåñòâëÿþùèå îäíîâðåìåííûé äîñòóï òîëüêîíà ÷òåíèå (áåç âìåøàòåëüñòâà ïèøóùèõ ïðîöåññîâ), ïîìåøàòü äðóã äðóãó íåìîãóò.Òàêèì îáðàçîì, çàäà÷à ÷èòàòåëåé è ïèñàòåëåé ñîñòîèò â òîì, ÷òîáû ïîçâîëèòü îäíîâðåìåííûé äîñòóï ê äàííûì ïðîèçâîëüíîìó ÷èñëó ÷èòàòåëåé, íîïðè ýòîì òàê, ÷òîáû íàëè÷èå õîòÿ áû îäíîãî ÷èòàòåëÿ èñêëþ÷àëî äîñòóï ïèñàòåëåé, à íàëè÷èå õîòÿ áû îäíîãî ïèñàòåëÿ èñêëþ÷àëî äîñòóï âîîáùå êîãî169áû òî íè áûëî, âêëþ÷àÿ è ÷èòàòåëåé.Äëÿ ðåøåíèÿ çàäà÷è ââåäåì îáùóþ ïåðåìåííóþ, êîòîðàÿ áóäåò ïîêàçûâàòü òåêóùåå êîëè÷åñòâî ÷èòàòåëåé (íàçîâåì åå rc îò ñëîâ readers count).Ýòî ïîçâîëèò ïåðâîìó ïðèøåäøåìó ÷èòàòåëþ óçíàòü, ÷òî îí ïåðâûé, è áëîêèðîâàòü äîñòóï ê áàçå äëÿ ïèñàòåëåé, à ïîñëåäíåìó óõîäÿùåìó ÷èòàòåëþ −óçíàòü, ÷òî îí ïîñëåäíèé, è ðàçáëîêèðîâàòü äîñòóï.
Äëÿ áëîêèðîâêè äîñòóïà ê äàííûì âîñïîëüçóåìñÿ ìüþòåêñîì db_mutex, à äëÿ çàùèòû öåëîñòíîñòèïåðåìåííîé rc íàì ïîòðåáóåòñÿ åùå îäèí ìüþòåêñ − rc_mutex.Ïðîöåäóðà çàïèñè â îáëàñòü îáùèõ äàííûõ (ïèñàòåëü) áóäåò äîñòàòî÷íîïðîñòîé:void writer(...) {lock(db_mutex);/* ... ïèøåì äàííûå â îáùóþ ïàìÿòü ... */unlock(db_mutex);}Ïðîöåäóðà ÷èòàòåëÿ îêàæåòñÿ ñóùåñòâåííî ñëîæíåå, ò.ê. òðåáóåò ìàíèïóëÿöèé ñ ïåðåìåííîé rc. ×èòàòåëü ïðåæäå âñåãî ïðîâåðÿåò, íå ïåðâûé ëè îíñðåäè ÷èòàòåëåé. Åñëè â íàñòîÿùèé ìîìåíò åñòü äðóãèå ÷èòàòåëè, îñóùåñòâëÿþùèå äîñòóï ê îáùåé ïàìÿòè, ÷èòàòåëü ïðîñòî ïðèñîåäèíÿåòñÿ ê íèì, îòðàçèâ ôàêò ñâîåãî ïðèñóòñòâèÿ â ïåðåìåííîé rc; åñëè æå äðóãèõ ÷èòàòåëåé íåò,ïåðâûé ïðèøåäøèé ÷èòàòåëü ñíà÷àëà äîæèäàåòñÿ, ïîêà êðèòè÷åñêóþ ñåêöèþíå ïîêèíåò ïèñàòåëü (åñëè, êîíå÷íî, òàêîâîé åñòü) − ýòî äåëàåòñÿ ñ ïîìîùüþáëîêèðîâêè ìüþòåêñà db_mutex.
Åñëè â ýòî âðåìÿ ê âõîäó â êðèòè÷åñêóþñåêöèþ ïîäîéäóò äðóãèå ÷èòàòåëè, îíè áëîêèðóþòñÿ íà ìüþòåêñå, çàùèùàþùåì ïåðåìåííóþ rc (rc_mutex â ýòîò ìîìåíò âñå åùå óäåðæèâàåò ÷èòàòåëü,ïðèøåäøèé ïåðâûì).void reader(...) {lock(rc_mutex);rc++;if(rc == 1) lock(db_mutex); /* ïåðâûé! */unlock(rc_mutex);/* ... ÷èòàåì äàííûå èç îáùåé ïàìÿòè ... */lock(rc_mutex);rc--;if(rc == 0) unlock(db_mutex); /* óõîäÿ, ãàñèòå ñâåò */unlock(rc_mutex);}170Ëåêöèÿ 142929.1Ñåìàôîðû è ìüþòåêñû â ÎÑ UnixÄâà òèïà ñåìàôîðîâ â ÎÑ Unix ñîâðåìåííûõ âåðñèÿõ ÎÑ Unix ñåìàôîðû ïðåäñòàâëåíû â äâóõ âàðèàíòàõ: ñåìàôîðû System V IPC è ñåìàôîðû POSIX.29.1.1Ñåìàôîðû System V IPCÏîäñèñòåìà System V IPC ïðåäîñòàâëÿåò òðè âèäà îáúåêòîâ ÿäðà, ïðåäíàçíà÷åííûõ äëÿ âçàèìîäåéñòâèÿ ïðîöåññîâ:• î÷åðåäè ñîîáùåíèé;• îáëàñòè ðàçäåëÿåìîé ïàìÿòè1 ;• ìàññèâû ñåìàôîðîâ.Âñå òðè âèäà îáúåêòîâ ñóùåñòâóþò íåçàâèñèìî îò ïîðîäèâøèõ èõ ïðîöåññîâ, òî åñòü ñîçäàííûé îáúåêò íåîáõîäèìî â ÿâíîì âèäå óíè÷òîæèòü, â ïðîòèâíîì ñëó÷àå îí îñòàíåòñÿ â ÿäðå ÎÑ äî ïåðåçàãðóçêè.
Äîñòóï ê îáúåêòàìIPC ìîæåò ïîëó÷èòü ëþáîé ïðîöåññ, èìåþùèé ñîîòâåòñòâóþùèå ïîëíîìî÷èÿ(èñïîëüçóþòñÿ ïðàâà äîñòóïà, àíàëîãè÷íûå ôàéëîâûì). Òàêèì îáðàçîì, ïðèíåîáõîäèìîñòè ìîæíî èñïîëüçîâàòü îáúåêòû System V IPC äëÿ âçàèìîäåéñòâèÿ ïðîöåññîâ, ïðèíàäëåæàùèõ ðàçíûì ïîëüçîâàòåëÿì.Ñåìàôîðû System V ÿâëÿþòñÿ îáúåêòàìè ÿäðà, ïðè÷åì êàæäûé îáúåêòìîæåò ñîäåðæàòü íåñêîëüêî ñåìàôîðîâ.
Ñèñòåìà äàåò âîçìîæíîñòü ôîðìèðîâàíèÿ ñëîæíûõ çàïðîñîâ ê òàêèì îáúåêòàì (ìîæíî, íàïðèìåð, ïîòðåáîâàòüóâåëè÷èòü ïåðâûé ñåìàôîð íà ïÿòü, óìåíüøèòü âòîðîé íà äâà è óìåíüøèòüòðåòèé íà ÷åòûðå − çà îäíî äåéñòâèå). Ïðè ýòîì ãàðàíòèðóåòñÿ àòîìàðíîñòüâñåãî äåéñòâèÿ. Ñëåäóåò îòìåòèòü, ÷òî, â äîïîëíåíèå ê îáû÷íûì îïåðàöèÿì, ñåìàôîðû System V IPC ïîääåðæèâàþò çàïðîñ áëîêèðîâàòü âûçâàâøèéïðîöåññ, ïîêà ñåìàôîð íå îêàæåòñÿ ðàâåí íóëþ.
×èòàòåëü ëåãêî ìîæåò óáåäèòüñÿ, ÷òî çàäà÷è î ïÿòè ôèëîñîôàõ è î ÷èòàòåëÿõ è ïèñàòåëÿõ îêàçûâàþòñÿî÷åíü ëåãêî ðàçðåøèìû ñ ïîìîùüþ ñåìàôîðîâ System V IPC: ïåðâàÿ − áëàãîäàðÿ íàëè÷èþ ìàññèâîâ ñåìàôîðîâ, âòîðàÿ − áëàãîäàðÿ íàëè÷èþ îïåðàöèèäîæäàòüñÿ íóëÿ.Íàäî îòìåòèòü, ÷òî System V IPC íå ïðåäîñòàâëÿåò îòäåëüíûõ îáúåêòîâäëÿ ìüþòåêñîâ, òàê ÷òî ïðè íåîáõîäèìîñòè ïðèõîäèòñÿ èìèòèðîâàòü ìüþòåêñû ñ ïîìîùüþ ñåìàôîðîâ.1 Íåîáõîäèìîîòìåòèòü, ÷òî ýòè îáúåêòû ðàçäåëÿåìîé ïàìÿòè íå èìåþò íè÷åãî îáùåãî ñ òåìè, êîòîðûåìû ïîëó÷àëè âûçîâîì mmap()171Èíòåðôåéñ ñèñòåìíûõ âûçîâîâ System V IPC äîñòàòî÷íî ñëîæåí è ãðîìîçäîê, ïîýòîìó ðàññìàòðèâàòü åãî ìû íå áóäåì.
Ïðè æåëàíèè ÷èòàòåëü ìîæåòèçó÷èòü System V IPC, íàïðèìåð, ñ ïîìîùüþ êíèãè [5].29.1.2Ñåìàôîðû è ìüþòåêñû POSIXÂòîðîé âèä ñåìàôîðîâ, äîñòóïíûé â ÎÑ Unix, âõîäèò â ïîäñèñòåìó óïðàâëåíèÿ ëåãêîâåñíûìè ïðîöåññàìè. Èõ èíòåðôåéñ ãîðàçäî ïðîùå: ïîääåðæèâàþòñÿ òîëüêî îïåðàöèè óâåëè÷åíèÿ è óìåíüøåíèÿ íà 1 (êàê è äëÿ êëàññè÷åñêèõñåìàôîðîâ Äåéêñòðû), îáúåäèíåíèÿ ñåìàôîðîâ â ìàññèâû íåò, êàê è îïåðàöèèäîæäàòüñÿ íóëÿ.Ïîäñèñòåìà ïîääåðæèâàåò êàê ñåìàôîðû, òàê è ìüþòåêñû. Íàäî îòìåòèòü, ÷òî è ñåìàôîðû, è ìüþòåêñû ñóùåñòâóþò â âèäå ïåðåìåííûõ â ïîëüçîâàòåëüñêîì ïðîöåññå; ÿäðî ïîääåðæèâàåò òîëüêî ñîîòâåòñòâóþùèå îïåðàöèèíàä íèìè.Ñòàíäàðò POSIX threads (pthreads) ïðåäóñìàòðèâàåò äîñòóï ê îäíîìó ñåìàôîðó èç ðàçíûõ ïðîöåññîâ, â òîì ÷èñëå è ÷åðåç èìåíà â ôàéëîâîé ñèñòåìå.Îäíàêî ìíîãèå ðåàëüíî ñóùåñòâóþùèå ñèñòåìû (â ÷àñòíîñòè, Linux) ïîääåðæèâàþò ñåìàôîðû POSIX òîëüêî â ðàìêàõ îäíîãî ïðîöåññà äëÿ âçàèìîäåéñòâèÿ â åãî ðàìêàõ ëåãêîâåñíûõ ïðîöåññîâ (ïîòîêîâ).29.2Pthreads: ëåãêîâåñíûå ïðîöåññû â ÎÑ Unix ýòîì ïàðàãðàôå ìû áóäåì äëÿ êðàòêîñòè èñïîëüçîâàòü òåðìèí ïîòîêïðè îáîçíà÷åíèè ëåãêîâåñíûõ ïðîöåññîâ (ðàíüøå ìû íå èñïîëüçîâàëè òàêóþòåðìèíîëîãèþ, ò.ê.
ñëîâî ïîòîê â ïðîãðàììèðîâàíèè èìååò ñëèøêîì ìíîãîçíà÷åíèé). Íàïîìíèì, ÷òî ñîîòâåòñòâóþùèé àíãëîÿçû÷íûé òåðìèí − thread. 1995 ãîäó áûë ïðèíÿò ñòàíäàðò, îïèñûâàþùèé ôóíêöèè óïðàâëåíèÿ ïîòîêàìè, ïîä îáùèì íàçâàíèåì pthreads.  íàñòîÿùåå âðåìÿ ýòîò ñòàíäàðò âòîé èëè èíîé ñòåïåíè ïîääåðæèâàåòñÿ âî âñåõ îïåðàöèîííûõ ñèñòåìàõ ñåìåéñòâà Unix, à òàêæå è â ñèñòåìàõ ëèíèè Windows.Ñîãëàñíî pthreads, ïîòîê äîëæåí èìåòü ãëàâíóþ ôóíêöèþ (àíàëîãè÷íîòîìó, êàê ïðîöåññ èìååò ôóíêöèþ main()) ñëåäóþùåãî âèäà:void* my_thread_main(void *arg) {/* ... */}Òàêèì îáðàçîì, ïîòîêó â êà÷åñòâå ñòàðòîâîãî ïàðàìåòðà ìîæíî ïåðåäàòü óêàçàòåëü íà ïðîèçâîëüíóþ îáëàñòü ïàìÿòè (void*); ïîòîê ìîæåò ïðè çàâåðøåíèè ñîîáùèòü äðóãèì ïîòîêàì ðåçóëüòàò ñâîåé ðàáîòû â âèäå, îïÿòü-òàêè,172ïðîèçâîëüíîãî óêàçàòåëÿ.
Çäåñü ïðîñëåæèâàåòñÿ íåêîòîðàÿ àíàëîãèÿ ñ îáû÷íûìè ïðîöåññàìè, êîòîðûå ïðè çàïóñêå ïîëó÷àþò â êà÷åñòâå àðãóìåíòà ãëàâíîé ôóíêöèè êîìàíäíóþ ñòðîêó, à ïðè çàâåðøåíèè ôîðìèðóþò ÷èñëîâîé êîäâîçâðàòà.Êàæäûé ïîòîê èìååò ñâîé óíèêàëüíûé èäåíòèôèêàòîð, êîòîðûé ìîæíîñîõðàíèòü â ïåðåìåííîé òèïà pthreads_t.Äëÿ ñîçäàíèÿ (è çàïóñêà) ïîòîêà èñïîëüçóåòñÿ ôóíêöèÿint pthread_create(pthread_t* thr, pthread_attr_t* attr,void*(*start_routine)(void*), void* arg);Ïàðàìåòð thr óêàçûâàåò, â êàêóþ ïåðåìåííóþ ñèñòåìå ñëåäóåò çàïèñàòü èäåíòèôèêàòîð íîâîãî ïîòîêà.
Àðãóìåíò attr ïîçâîëÿåò çàäàòü ñïåöèôè÷åñêèåïàðàìåòðû ðàáîòû íîâîãî ïîòîêà; â áîëüøèíñòâå ñëó÷àåâ òàêèå ïàðàìåòðûíå íóæíû, òàê ÷òî ìîæíî â êà÷åñòâå ýòîãî àðãóìåíòà ïåðåäàòü íóëåâîé óêàçàòåëü. Ïàðàìåòð start_routine óêàçûâàåò íà ãëàâíóþ ôóíêöèþ ïîòîêà.Èìåííî ýòà ôóíêöèÿ áóäåò çàïóùåíà âî âíîâü ñîçäàííîì ïîòîêå, ïðè÷åì íàâõîä åé áóäåò ïåðåäàí óêàçàòåëü, êîòîðûé ïðè âûçîâå pthread_create ìûóêàçàëè â êà÷åñòâå ïàðàìåòðà arg.Ôóíêöèÿ pthread_create âîçâðàùàåò 0 â ñëó÷àå óñïåõà, ëèáî êîä îøèáêè, åñëè ñîçäàòü íîâûé ïîòîê íå óäàëîñü (äëÿ äàííîé ôóíêöèè òàêèì êîäîììîæåò áûòü òîëüêî EAGAIN, êîòîðûé îçíà÷àåò, ÷òî äëÿ ñîçäàíèÿ ïîòîêà íåõâàòèëî ñèñòåìíûõ ðåñóðñîâ, ëèáî áûëî äîñòèãíóòî ïðåäåëüíîå êîëè÷åñòâîïîòîêîâ äëÿ îäíîãî ïðîöåññà).Ïîòîê ìîæåò çàâåðøèòüñÿ äâóìÿ ñïîñîáàìè: âåðíóâ óïðàâëåíèå èç ñâîåé ãëàâíîé ôóíêöèè (ïîäîáíî òîìó, êàê ïðîöåññ âîçâðàùàåò óïðàâëåíèå èçôóíêöèè main()) ëèáî âûçâàâ ôóíêöèþvoid pthread_exit(void *retval); ïåðâîì ñëó÷àå ðåçóëüòàòîì ðàáîòû ïîòîêà ñòàíåò çíà÷åíèå, âîçâðàùåííîåèç ãëàâíîé ôóíêöèè (íàïîìíèì, îíî èìååò òèï void*), âî âòîðîì ñëó÷àå −çíà÷åíèå àðãóìåíòà retval.
Çäåñü ñíîâà ïðîñëåæèâàþòñÿ àíàëîãèè ñ óïðàâëåíèåì ïðîöåññàìè, íà ñåé ðàç − ñ ôóíêöèåé exit().Ïîòîê ìîæåò äîæäàòüñÿ çàâåðøåíèÿ äðóãîãî ïîòîêà ñ ïîìîùüþ ôóíêöèèint pthread_join(pthread_t th, void **result);Àðãóìåíò th çàäàåò èäåíòèôèêàòîð òðåäà, çàâåðøåíèÿ êîòîðîãî ìû õîòèìæäàòü. ×åðåç ïàðàìåòð result ïåðåäàåòñÿ àäðåñ óêàçàòåëÿ òèïà void*, â êîòîðûé ñëåäóåò çàïèñàòü ðåçóëüòàò ðàáîòû ïîòîêà.
Ýòî íåñêîëüêî íàïîìèíàåòôóíêöèîíèðîâàíèå âûçîâà waitpid() äëÿ îáû÷íûõ ïðîöåññîâ.173Ðåçóëüòàò âûïîëíåíèÿ çàâåðøåííîãî ïîòîêà äîëæåí ãäå-òî õðàíèòüñÿ; åñëè åãî íå âîñòðåáîâàòü âûçîâîì pthread_join(), îí áóäåò âïóñòóþ çàíèìàòüñèñòåìíûå ðåñóðñû, êàê ýòî ïðîèñõîäèò ñ ïðîöåññàìè (çîìáè). Îäíàêî äëÿïîòîêîâ ýòîãî ìîæíî èçáåæàòü, ïåðåâåäÿ ïîòîê â îòñîåäèíåííûé ðåæèì(àíãë. detached mode ). Ýòî äåëàåòñÿ ôóíêöèåéint pthread_detach(pthread_t th);Íåäîñòàòîê îòñîåäèíåííûõ ïîòîêîâ â òîì, ÷òî èõ íåâîçìîæíî äîæäàòüñÿ ñïîìîùüþ pthread_join() è, ñîîòâåòñòâåííî, íåò ñïîñîáà ïðîàíàëèçèðîâàòüðåçóëüòàò èõ ðàáîòû.Ôóíêöèè pthread_detach() è pthread_join() âîçâðàùàþò, êàê èpthread_create(), 0 â ñëó÷àå óñïåõà, ëèáî êîä îøèáêè, åñëè âûïîëíèòü äåéñòâèå íå óäàëîñü.Óçíàòü ñâîé ñîáñòâåííûé èäåíòèôèêàòîð ïîòîê ìîæåò ñ ïîìîùüþ ôóíêöèèpthread_t pthread_self();Íàïðèìåð, ïîòîê ìîæåò ïåðåâåñòè ñàìîãî ñåáÿ ââûïîëíèâ âûçîâîòñîåäèíåííûé ðåæèì,pthread_detach(pthread_self());.Ïîòîê ìîæåò äîñðî÷íî çàâåðøèòü äðóãîé ïîòîê, âûçâàâ ôóíêöèþint pthread_cancel(pthread_t th); ýòîì ñëó÷àå ðåçóëüòàòîì ðàáîòû ïîòîêà th áóäåò ñïåöèàëüíîå çíà÷åíèåPTHREAD_CANCELED.Ñëåäóåò îòìåòèòü, ÷òî âûçîâpthread_cancel() íå óíè÷òîæàåò ïîòîê, à îòìåíÿåòåãî, ÷òî,âîîáùå ãîâîðÿ, íå âñåãäà ïðèâîäèò ê íåìåäëåííîìó ïðåêðàùåíèþ âûïîëíåíèÿ äðóãîãî ïîòîêà: âîçìîæíî, ÷òî ïîòîê çàâåðøèòñÿ, òîëüêî äîéäÿ äî âûçîâà îäíîé èç ôóíêöèé áèáëèîòåêèpthread, âõîäÿùåé â ÷èñëî òî÷åê îòìåíû (àíãë.
cancellation points ). Òàêèå ôóíêöèè, êðîìå îñíîâíûõ äåéñòâèé, ïðîèçâîäÿò ïðîâåðêó íà íàëè÷èå çàïðîñà íà îòìåíó äàííîãî ïîòîêà. Ñïèñîêôóíêöèé, ÿâëÿþùèõñÿ òî÷êàìè îòìåíû, ìîæíî óçíàòü èç äîêóìåíòàöèè íà29.3Âpthread_cancel().Ìüþòåêñû pthreadsêà÷åñòâåìüþòåêñîâ pthreads èñïîëüçóåò ïåðåìåííûå òèïàpthreads_mutex_t. Íà÷àëüíîå çíà÷åíèå òàêîé ïåðåìåííîé, ñîîòâåòñòâóþùåå ñîñòîÿíèþ ìüþòåêñ îòêðûò, ñëåäóåò çàäàòü èíèöèàëèçàòîðîìPTHREAD_MUTEX_INITIALIZER, íàïðèìåð:pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER;174Âîçìîæíû è äðóãèå, áîëåå ñëîæíûå âàðèàíòû èíèöèàëèçàöèè ìüþòåêñà,â òîì ÷èñëå ñ ïîìîùüþ ñïåöèàëüíîé ôóíêöèè, îäíàêî äëÿ íàøèõ èëëþñòðàòèâíûõ öåëåé äîñòàòî÷íî îäíîãî. Ñëåäóåò îáðàòèòü âíèìàíèå, ÷òîPTHREAD_MUTEX_INITIALIZER ïðåäñòàâëÿåò ñîáîé èìåííî èíèöèàëèçàòîð,ò.å., âîîáùå ãîâîðÿ, ïîïûòêà ïðèñâîèòü ìüþòåêñó ýòî çíà÷åíèå, ñêîðåå âñåãî, ïðèâåäåò ê îøèáêå ïðè êîìïèëÿöèè (ðåçóëüòàò ìàêðîïîäñòàíîâêè ýòîãîìàêðîñà ìîæåò ñîäåðæàòü ôèãóðíûå ñêîáêè).Íàïîìíèì, ÷òî ïîä ìüþòåêñîì ïîíèìàåòñÿ îáúåêò, ñïîñîáíûé íàõîäèòüñÿâ îäíîì èç äâóõ ñîñòîÿíèé (îòêðûòîì è çàêðûòîì), íàä êîòîðûì îïðåäåëåíû äâå îïåðàöèè: îòêðûòèå (unlock()) è çàêðûòèå (lock()), ïðè÷åì ïåðâàÿâñåãäà ïåðåâîäèò ìüþòåêñ â îòêðûòîå ñîñòîÿíèå è âîçâðàùàåò óïðàâëåíèå,âòîðàÿ æå, åñëè åå ïðèìåíèòü ê îòêðûòîìó ìüþòåêñó, çàêðûâàåò åãî è âîçâðàùàåò óïðàâëåíèå, åñëè æå åå ïðèìåíèòü ê çàêðûòîìó ìüþòåêñó, ìîæåò ëèáîâåðíóòü óïðàâëåíèå, ñèãíàëèçèðóÿ î íåóäà÷å (íåáëîêèðóþùèé âàðèàíò), ëèáîáëîêèðîâàòü âûçâàâøèé ïðîöåññ (èëè, â äàííîì ñëó÷àå, ïîòîê), äîæäàòüñÿ,ïîêà êòî-òî íå îòêðîåò ìüþòåêñ, çàêðûòü åãî è òîëüêî ïîñëå ýòîãî âåðíóòüóïðàâëåíèå (áëîêèðóþùèé âàðèàíò). pthreads îñíîâíûå îïåðàöèè íàä ìüþòåêñàìè îñóùåñòâëÿþòñÿ ñ ïîìîùüþ ôóíêöèéint pthread_mutex_unlock(pthread_mutex_t *mutex);int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_trylock(pthread_mutex_t *mutex);Ýòè ôóíêöèè îñóùåñòâëÿþò, ñîîòâåòñòâåííî, îòêðûòèå ìüþòåêñà (unlock),áëîêèðóþùåå çàêðûòèå ìüþòåêñà (lock) è íåáëîêèðóþùåå çàêðûòèå ìüþòåêñà (trylock).