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

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

Автор Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ ОлСг Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡

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

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(

Β pthread_mutexattr_t* attr, int protocol);

int pthread_mutexattr_getprotocol(

Β pthread_mutexattr_t* attr, int* protocol);

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚/ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСализуСтся ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ

protocol
ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

PTHREAD_PRIO_INHERIT
(Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) β€” опрСдСляСт, Ρ‡Ρ‚ΠΎ для воспрСпятствования возникновСнию инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» наслСдования ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ².

PTHREAD_PRIO_PROTECT
β€” любой ΠΏΠΎΡ‚ΠΎΠΊ, Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈ созданный с Ρ‚Π°ΠΊΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ фиксированный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° Π² соотвСтствии со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ поля
prioceiling
, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ
pthread_mutexattr_getprioceiling()
. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, установка этого значСния Π² качСствС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ².

Π’Π½Π΅ΡˆΠ½ΠΈΠΉ доступ

int pthread_mutexattr_setpshared(

Β pthread_mutexattr_t* attr, int pshared);

int pthread_mutexattr_getpshared(

Β const pthread_mutexattr_t* attr, int* pshared);

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚/ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ ΠΏΠΎΠ»Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π»ΠΈ доступ ΠΊ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡƒ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… Π²Π½Π΅ процСсса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π» создан ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

pshared
ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

PTHREAD_PROCESS_SHARED
β€” любой ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· любого процСсса Π² систСмС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ (для этого придСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² IPC, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ shared memory), ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

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

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ рСкурсивного Π·Π°Ρ…Π²Π°Ρ‚Π°

int pthread_mutexattr_setrecursive(

Β pthread_mutexattr_t* attr, int recursive);

int pthread_mutexattr_getrecursive(

Β const pthread_mutexattr_t* attr, int* recursive);

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