Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 38

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

 }

private:

 std::queue<T> _data_queue;

 event data_event;

};

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ CDataQueue Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для хранСния вновь ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ практичСски нСзависимыми ΠΏΠΎΡ‚ΠΎΠΊΠΈ производитСля ΠΈ потрСбитСля. НСзависимыми Π²ΠΎ всСх случаях, ΠΊΡ€ΠΎΠΌΠ΅ пустой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ производитСля. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ внСсСт Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΏΠΎΡ‚ΠΎΠΊ потрСбитСля разблокируСтся ΠΈ считаСт эти Π΄Π°Π½Π½Ρ‹Π΅. Π’ΠΎΠ½ΠΊΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ потрСбитСля блокируСтся сам ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pop(), Π° разблокируСтся ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° производитСля ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ push().

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² построСнии спСцифичСских срСдств синхронизации Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного, Π²ΠΎΠΏΡ€Π΅ΠΊΠΈ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰Π΅ΠΌΡƒΡΡ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎ созданиС срСдств синхронизации со спСцифичСским ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½ΠΎ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎ, Π° ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΊΠΎΠ΄ позволяСт Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ возмоТности Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сСмафора ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ «бСзопасным» использованиСм описанной схСмы Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² β€” ΠΎΠ΄Π½ΠΎΠ³ΠΎ производитСля ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ потрСбитСля. Если нСсколько (Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ…) ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pop() ΠΈΠ»ΠΈ push(), начнСтся ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π°, ΠΈ Ρ‡Π΅ΠΌ это закончится, ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. По своСй Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΊΠΎΠ΄ ΠΎΠ±Π΅ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ систСмС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ эксклюзивного исполнСния. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ этим участкам ΠΊΠΎΠ΄Π°, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСмафор, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ срСдство синхронизации, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, - ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

ΠœΡŒΡŽΡ‚Π΅ΠΊΡ

ΠœΡŒΡŽΡ‚Π΅ΠΊΡ (ΠΎΡ‚ mutual exclusion β€” Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅) β€” это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² синхронизации QNX Neutrino. Π­Ρ‚ΠΎΡ‚ элСмСнт рСализуСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ микроядра систСмы ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ€ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈ настроСк. НазначСниС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° β€” Π·Π°Ρ‰ΠΈΡ‚Π° участка ΠΊΠΎΠ΄Π° ΠΎΡ‚ совмСстного выполнСния нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π’Π°ΠΊΠΎΠΉ участок ΠΊΠΎΠ΄Π° ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ критичСской сСкциСй, ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ являСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ обращСния ΠΊ раздСляСмому рСсурсу.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (Π·Π°Ρ…Π²Π°Ρ‚Π°) pthread_mutex_lock() провСряСтся, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ Π»ΠΈ ΡƒΠΆΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся Π΄ΠΎ освобоТдСния критичСской сСкции. Если ΠΆΠ΅ Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΅Π³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°) ΠΈ устанавливаСт ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½.

Когда дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСльзя ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ совмСстно, Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Ρ‹, ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (освобоТдСния) pthread_mutex_unlock(), которая провСряСт, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ Π΅Π΅ ΠΏΠΎΡ‚ΠΎΠΊ являСтся Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ ΠΎΠ½Π° Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, послС Ρ‡Π΅Π³ΠΎ ОБ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Если Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ освобоТдСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, пСрСводится ΠΈΠ· состояния блокирования Π² состояниС готовности ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π’ QNX Neutrino 6.2.1 ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈΠΌΠ΅Π΅Ρ‚ наибольшиС возмоТности ΠΏΠΎ Ρ‚ΠΎΠ½ΠΊΠΎΠΉ настройкС своих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² срСди всСх ΠΈΠ½Ρ‹Ρ… элСмСнтов синхронизации. Π’ связи с этим ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΎΡ‡Π΅Π½ΡŒ сильно зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ значСния Π²Ρ‹ присвоитС Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΎΡ‚ сСмафора Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄ критичСской сСкции. ΠžΡ‚ΡΡŽΠ΄Π° ΠΈ ваТнСйшиС свойства ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ нСльзя Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Если ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Π³ΠΎ Β«ΠΎΡ‚ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΒ». Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ (tid ΠΏΠΎΡ‚ΠΎΠΊΠ°), систСма ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ врСмя ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². НаконСц, зная ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ, ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, пытаСтся Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ (ΠΎΠ΄Π½Π° ΠΈΠ· разновидностСй deadlock β€” ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ сущСствуСт Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, способного ΠΎΡ‚ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ освобоТдСния этого ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°).

Π’ ОБ QNX Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Π½Π΅ прСдусмотрСнный стандартом POSIX, β€” рСкурсивный ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. Π’ этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΡ‚ΠΎΠΊ, Π²Π»Π°Π΄Π΅ΡŽΡ‰ΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Π΅Π³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Π΅, Π½Π΅ блокируСтся. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ Π² своСм Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ счСтчикС, сколько Ρ€Π°Π· ΠΎΠ½ Π±Ρ‹Π» Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½, ΠΈ разблокируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ€Π°Π²Π½ΠΎΠ³ΠΎ количСства освобоТдСний (СстСствСнно, Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ).

ВсС объявлСния ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² находятся Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <pthread.h>, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ:

#include <pthread.h>

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° хранятся Π² структурС pthread_mutexattr_t, которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Ρ‚ΠΈΠΏΠΎΠΌ sync_attr_t. Π­Ρ‚Π° структура Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ, создана ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π΄ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, послС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΈ использована для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

int pthread_mutexattr_init(const pthread_mutexattr_t* attr);

Ѐункция ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ структуру Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ attr. Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… pthread_mutexattr_t ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅ <pthread.h> (ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° sync_attr_t, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅ <target_nto.h>) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

struct _sync_attr_t {

 int protocol;

 int flags;

 int prioceiling;

 int clockid; /* Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для condvar */

 int reserved[4];

};

ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Ρ‹ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅.

Установка Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°

int pthread_mutexattr_setprioceiling(

 pthread_mutexattr_t* attr, int prioceiling);

int pthread_mutexattr_getprioceiling(

 const pthread_mutexattr_t* attr, int* prioceiling);

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚/Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠ΅ΠΌΡƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Ссли ΠΏΠΎΠ»Π΅ protocol структуры pthread_mutexattr_t установлСно Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_PRIO_PROTECT.

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° (Priority Ceiling Protocol), ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰Π΅Π³ΠΎ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² Ρ‚Π°ΠΌ, Π³Π΄Π΅ наслСдованиС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСэффСктивно ΠΈΠ»ΠΈ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Как извСстно, классичСский случай инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ€Π°Π·Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ‰ΠΈΠΉ рСсурс. Π’ этой ситуации Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ стСчСниС ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π², ΠΊΠΎΠ³Π΄Π° Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ рСсурс, Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ вытСсняСтся ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ срСднСго ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, Π° ΠΏΠΎΡ‚ΠΎΠΊ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ блокируСтся Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ освобоТдСния рСсурса, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Π­Ρ‚Π° ситуация Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ описана Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ [4], Π³Π΄Π΅ приводится ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· повСдСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ОБ Π² этой ситуации. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ являСтся ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» наслСдования ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², ΠΊΠΎΠ³Π΄Π° ОБ распознаСт ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ блокирования ΠΈ автоматичСски ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ вытСснСнного ΠΏΠΎΡ‚ΠΎΠΊΠ° (Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°) Π΄ΠΎ уровня Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠ΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΈΠ· числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… освобоТдСния рСсурса. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΊ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π½Π΅ вытСсняСтся, ΠΊΠ°ΠΊ Π½Π°Π΄Π»Π΅ΠΆΠ°Π»ΠΎ Π±Ρ‹ Π² соотвСтствии с Π΅Π³ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Π° быстро ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ (освобоТдая Π΅Π΅), послС Ρ‡Π΅Π³ΠΎ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ возвращаСтся Π½Π° исходный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ.

Π’ рядС случаСв наслСдованиС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ самым ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ здСсь ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ситуация, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ высокоприоритСтный ΠΏΠΎΡ‚ΠΎΠΊ раздСляСт ΠΌΠ½ΠΎΠ³ΠΎ рСсурсов с Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ β€” ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ рСсурсу Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π’ Ρ‚Π°ΠΊΠΎΠΉ ситуации ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (вытСснСнных) выстроятся ΠΏΠ΅Ρ€Π΅Π΄ высокоприоритСтным. Но Ρ‚ΠΎΠ³Π΄Π° Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ряд ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ вытСснСния (Β«ΠΏΠΎΡˆΡ‚ΡƒΡ‡Π½ΠΎΒ») ΠΈ наслСдования ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎ окончания критичСского срока выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠ° высокого ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, ΠΏΠΎΠΊΠ° ОБ Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» наслСдования ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ².

ИмСнно для Ρ‚Π°ΠΊΠΈΡ… ситуаций ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°. Π’ соотвСтствии с этим ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² синхронизации (Π² нашСм рассмотрСнии это ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ) надСляСтся собствСнным фиксированным ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ любого ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ этот ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, поднимаСтся Π΄ΠΎ прСдустановлСнного Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ уровня ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ²

int pthread_mutexattr_setprotocol(