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

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

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

PTHREAD_RECURSIVE_ENABLE
β€” Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ рСкурсивный Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°;

PTHREAD_RECURSIVE_DISABLE
(Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) β€” Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ рСкурсивный Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌ ΡƒΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚, Π²Ρ‹Π·ΠΎΠ²
pthread_mutex_lock()
Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π·Π°Ρ…Π²Π°Ρ‚Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈ Π²Π΅Ρ€Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
EDEADLK
.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

int pthread_mutexattr_settype(

Β pthread_mutexattr_t* attr, int type);

int pthread_mutexattr_gettype(

Β const pthread_mutexattr_t* attr, int* type);

Π’ вСрсиях QNX 6.2.1 ΠΈ 6.3 прСдусматриваСтся созданиС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ²:

β€’Β 

PTHREAD_MUTEX_NORMAL
β€” для этого Ρ‚ΠΈΠΏΠ° Π½Π΅ проводится ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Β«ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈΒ» (deadlock) Π² ситуации, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ, Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, пытаСтся Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ этот ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ бСзусловно Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² Β«ΠΌΠ΅Ρ€Ρ‚Π²ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒΒ», Π° это Π²ΠΎ всСх случаях аварийная ситуация Π² Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ прилоТСния); Ρ‚Π°ΠΊΠΎΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΡƒΠΆΠ΅ Π½Π΅ΠΊΠΎΠΌΡƒ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ своим Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ). ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ (unlock) ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΈΠ»ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚, ΠΏΡ€ΠΈ этом Π½Π΅ возвращаСтся ошибка выполнСния.

β€’Β 

PTHREAD_MUTEX_ERRORCHECK
β€” Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ошибок. Π’ этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ситуации:

β€’Β ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ;

β€’Β ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° освобоТдСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ;

‒ освобоТдСниС свободного ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

β€’Β 

PTHREAD_MUTEX_RECURSIVE
β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ рСкурсивный Π·Π°Ρ…Π²Π°Ρ‚. ΠŸΠΎΡ‚ΠΎΠΊ, ΠΏΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠΉΡΡ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π² этом ΠΏΠΎΡ‚ΠΎΠΊΠ΅, смоТСт это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΡ€ΠΈ этом количСство Π·Π°Ρ…Π²Π°Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ освобоТдСнии ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ смоТСт Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСн ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Ρ€Π°Π·, сколько Π±Ρ‹Π» Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½. Если ΠΏΠΎΡ‚ΠΎΠΊ пытаСтся ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΈΠ»ΠΈ свободный ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ сообщСниС ΠΎΠ± ошибкС (Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ошибки, прСдусмотрСнныС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся для рСкурсивного ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΌ дСйствиСм).

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

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ рСкурсивного Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ установкой Π΄Π²ΡƒΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (

type
ΠΈ
recursive
).

β€’Β 

PTHREAD_MUTEX_DEFAULT
(Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) β€” ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° рСкурсивного Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, освобоТдСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΈΠ»ΠΈ освобоТдСния ΡƒΠΆΠ΅ свободного ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΈ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ выполнСния.

ОсвобоТдСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

int pthread_mutexattr_destroy(pthread_mutexattr_t* attr);

Π’Ρ‹Π·ΠΎΠ² Ρ€Π°Π·Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ²ΡˆΠΈΠΉΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ - Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΡƒΡŽ запись ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, послС Ρ‡Π΅Π³ΠΎ ΠΎΠ½Π° ΡƒΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π±Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния Π²Ρ‹Π·ΠΎΠ²Π°

pthread_mutexattr_init()
.

На этом обсуТдСниС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² заканчиваСтся, ΠΈ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ нСпосрСдствСнно ΠΊ функциям Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

int pthread_mutex_init(pthread_mutex_t* mutex,

Β const pthread_mutexattr_t* attr);

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…

pthread_mutex_t
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Ρ„Π°ΠΉΠ»Π΅
<pthread.h>
(ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ°
sync_t
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅
<target_nto.h>
) ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

struct _sync_t {

Β /* Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ для рСкурсивного ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈΠ»ΠΈ сСмафора */

Β int count;

Β /* TID ΠΏΠΎΡ‚ΠΎΠΊΠ° - ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈ примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² */

Β unsigned owner;

};

Ѐункция

pthread_mutex_init()
ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π² соотвСтствии со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Если вмСсто
attr
ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ
NULL
, Ρ‚ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π±ΡƒΠ΄Π΅Ρ‚ создан Π² соотвСтствии со значСниями Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ native QNX API эта функция рСализуСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ
SyncTypeCreate()
.
SyncTypeCreate()
β€” Сдиная функция для создания всСх Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² синхронизации QNX Neutrino.

ВмСсто прямого Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

pthread_mutex_init()
для Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ статичСских ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ пространства ΠΈΠΌΠ΅Π½ namespace Π»ΠΈΠ±ΠΎ явно описанных с ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ static) ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ двумя макросами
PTHREAD_MUTEX_INITIALIZER
ΠΈ
PTHREAD_RMUTEX_INITIALIZER
:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_t mutex = PTHREAD_RMUTEX_INITIALIZER;

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… создаСт ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π² соотвСтствии со значСниями Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ - ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΌ рСкурсивным Π·Π°Ρ…Π²Π°Ρ‚ΠΎΠΌ.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ послС Π΅Π³ΠΎ создания. Но Π½Π΅ всС. Π’ процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ систСма ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° с Ρ†Π΅Π»ΡŒΡŽ прСдотвращСния инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ²:

int pthread_mutex_setprioceiling(pthread_mutex_t* mutex,

Β int prioceiling, int* old_ceiling);

int pthread_mutex_getprioceiling(const pthread_mutex_t* mutex,

Β int* prioceiling);

Ѐункция

pthread_mutex_setprioceiling()
Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ (ΠΈΠ»ΠΈ блокируСтся, ΠΏΠΎΠΊΠ° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСн, ΠΈ ΡƒΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π° Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ) ΠΈ измСняСт ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ для Π½Π΅Π³ΠΎ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, послС Ρ‡Π΅Π³ΠΎ освобоТдаСт ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ для использования Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. ПослС измСнСния значСния Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ возвращаСтся Π²
old_ceiling
.

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

EOK
β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅;

EINVAL
β€” ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π΅ сущСствуСт ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ допустимых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ;

EPERM
β€” ΠΏΠΎΡ‚ΠΎΠΊ, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π² Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.