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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈ распрСдСлСнноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 55

Автор Π₯ьюз ΠšΠ°ΠΌΠ΅Ρ€ΠΎΠ½

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ тСстирования монопольного использования ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ доступности ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Если ΠΎΠ½ занят, функция Π²ΠΎΠ·Π²Ρ€Π° Ρ‰ Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Достоинство этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ процСсс (Π² случаС нСдоступности ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°) Π½Π΅ блокируСтся ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Если ΠΆΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ свободСн, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈΠ»ΠΈ процСссу прСдоставляСтся ΠΏΡ€Π°Π²ΠΎ владСния Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ.

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ освобоТдаСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ, связанная с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ. ΠŸΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ освобоТдаСтся, Ссли Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π΅ΡΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΈΠ»ΠΈ Ссли ΠΏΠΎΡ‚ΠΎΠΊ (ΠΈΠ»ΠΈ процСсс) ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ ΠΏΡ€Π°Π²Π° Π½Π° Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ ΠΈΠΌ.

ИспользованиС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

ΠœΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° pthread_mutex_t ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎ ΠΌ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠœΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ инкапсулируСт всС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌ ΡŒΡŽΡ‚Π΅ΠΊΡΠ°. ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅Π³ΠΎ ΠΌ ΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΌ ΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π» Π² качСствС ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_mutex_init (). ΠœΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ опрСдСляСт ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для установки Ρ‚Π°ΠΊΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΈ Ρ‚ΠΈΠΏ. Π­Ρ‚ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌ ΡŒΡŽΡ‚Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° пСрСчислСны Π² Ρ‚Π°Π±Π». 5.3.

Π’Π°Π±Π»ΠΈΡ†Π° 5.3. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ доступа ΠΊ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½ΠΎΠΌΡƒ Π°Ρ‚Ρ€ΠΈΠ±Ρƒ Ρ‚ Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

ОписаниС

int pthread_mutexattr_init (pthread_mutexattr_t * attr);

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr, значСниями, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для всСх Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², опрСдСляСмых Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ

int pthread_mutexattr_destroy (pthread_mutexattr_t * attr);

Π Π°Π·Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΠΎΠ½ становится Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_mutexattr_init()

int pthread_mutexattr_setprioceiling (pthread_mutexattr_t * attr, int prioceiling);

УстанавливаСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ prioceiling содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Атрибут prioceiling опрСдСляСт ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅Ρ‰Π΅ выполняСтся критичСский Ρ€Π°Π·Π΄Π΅Π», Π·Π°Ρ‰ΠΈΡ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ. ЗначСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² этот Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ стратСгиСй планирования

SCHED_FIFO

int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t * restrict attr, int *restrict prioceiling);

int pthread_mutexattr_setprotocol (pthread_mutexattr_t * attr, protocol int protocol);

УстанавливаСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ protocol ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

PTHREAD_PRIO_NONE

(Π½Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΈ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ планирования ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π»ΠΈ

я

Π½ΠΈ

я);

int pthread_mutexattr_getprotocol (const pthread_mutexattr_t * restrict attr, int *restrict protocol);

PTHREAD_PRIO_INHERIT

(ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π΅ ΠΏΠΎΡ‚ΠΎΠΊ, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ с Π±ΠΎΠ»Π΅Π΅ высокими ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ, благодаря владСнию Ρ‚Π°ΠΊΠΈΠΌ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ с самым высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΈΠ· ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… освобоТдСния любого ΠΈΠ· ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Π»Π°Π΄Π΅Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ);

PTHREAD_PRIO_PROTECT

(ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π²Π»Π°Π΄Π΅ΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΡ… ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… значСниях ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² всСх ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Π»Π°Π΄Π΅ΡŽΡ‚ эти ΠΏΠΎΡ‚ΠΎΠΊΠΈ, нСзависимо ΠΎΡ‚Ρ‚ΠΎΠ³ΠΎ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΈΠ· этих ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ²)

int pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, int pshared);

УстанавливаСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ process-shared ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pshared ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

int pthread_mutexattr_getpshared (const pthread_mutexattr_t * restrict attr, int *restrict pshared);

PTHREAD_PROCESS_SHARED

(Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ для этого ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° памяти, Π΄Π°ΠΆΠ΅ Ссли эти ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ процСссам);

PTHREAD_PROCESS_PRIVATE

(ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ раздСляСтся ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ процСсса)

int pthread_mutexattr_settype (pthread_mutexattr_t* attr, int type);

УстанавливаСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

type

ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ

attr

. Атрибут ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

type

позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ошибки ΠΈ Ρ‚.Π΄. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

type

ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ значСния:

int

PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_ERRORCHECK PTHREAD_MUTEX_NORMAL

pthread_mutexattr_gettype (const pthread_mutexattr_t * restrict attr, int *restrict type);

Π‘Π°ΠΌΡ‹ΠΉ большой интСрСс прСдставляСт установка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, связанного с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ: Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΈΠ»ΠΈ раздСляСмым. Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса. МоТно Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ, Π»ΠΈΠ±ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ дСскриптора ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. РаздСляСмыС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈ доступ ΠΊ памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅ Ρ‰ Π΅Π½ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. Π’Π°ΠΊΠΎΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… процСссов. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ дСйствия Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΈ раздСляСмого ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рис. 5.5. Если Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ приходится ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… процСссов, Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² памяти, которая являСтся ΠΎΠ±Ρ‰Π΅ΠΉ для этих процСссов. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ POSIX ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для распрСдСлСния памяти ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Ρ… Π² памяти Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² раздСляСмой памяти. Π’ процСссах ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ критичСских Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ доступ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ, ΠΊΠ°Π½Π°Π»Π°ΠΌ, ΠΎΠ±Ρ‰Π΅ΠΉ памяти ΠΈ внСшним устройствам.

ИспользованиС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹Ρ… сСмафоров для управлСния критичСскими Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌΠΈ

ΠœΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для управлСния критичСскими Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌΠΈ процСссов ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ условий Β«Π³ΠΎΠ½ΠΎΠΊΒ». ΠœΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ условий Β«Π³ΠΎΠ½ΠΎΠΊΒ», рСализуя ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ критичСскому Ρ€Π°Π·Π΄Π΅Π»Ρƒ. Рассмотрим ΠΊΠΎΠ΄ листинга5.1. Π’ Π½Π΅ΠΌ дСмонстрируСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΈΡ… критичСских Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹.

// Листинг 5.1. ИспользованиС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² для Π·Π°Ρ‰ΠΈΡ‚Ρ‹

// критичСских Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

// . . .

pthread_t ThreadA, ThreadB; pthread_mutex_t Mutex,-pthread_mutexattr_t MutexAttr;

void *task1(void *X) {

pthread_mutex_lock(&Mutex); // ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π» ΠΊΠΎΠ΄Π°.

pthread_mutex_unlock(&Mutex);

return(0) ;

}

void *task2 (void *X) {

pthread_mutex_lock(&Mutex) ;

// ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π» ΠΊΠΎΠ΄Π°.

pthread_mutex_unlосk (&Mu t ex) ; return(0) ;

}

int main(void) {

//...

pthread_mutexattr_init (&MutexAttr) ;

pthread_mutex_init (&Mutex, &MutexAttr) ;

//УстанавливаСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

pthread_create(&ThreadA, NULL, taskl, NULL) ; pthread_create(&ThreadB,NULL, task2,NULL) ;

//...

return(0) ;