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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² QNX/Neutrino 2. Руководство ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² QNX Realtime PlatformΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 17

Автор Π ΠΎΠ± ΠšΡ‘Ρ€Ρ‚Π΅Π½

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ чтСния/записи.

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… областСй памяти для rwlock-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ (чтСния/записи):

int pthread_rwlock_init(pthread_rwlock_t *lock,

 const pthread_rwlockattr_t *attr);


int pthread_rwlock_destroy(pthread_rwlock_t *lock);

Ѐункция pthread_rwlock_init() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ lock (Ρ‚ΠΈΠΏΠ° pthread_rwlock_t) ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ attr. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ NULL, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Β«ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ». Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ± этом см. Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

pthread_rwlockattr_init();

pthread_rwlockattr_destroy();

pthread_rwlockattr_getpshared();

pthread_rwlockattr_setpshared().

Когда ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ свои Π΄Π΅Π»Π° с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ чтСния/записи, Π΅Ρ‘ слСдуСт ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ pthread_rwlock_destroy().

Никогда Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, которая Π»ΠΈΠ±ΠΎ ΡƒΠΆΠ΅ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Π°, Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°.

Π”Π°Π»Π΅Π΅, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ подходящСго Ρ‚ΠΈΠΏΠ°. Как ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Π² основном ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ: Β«Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽΒ» ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Β«Π½Π΅ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½Ρ‹ΠΉΒ» доступ, Π° для Β«ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŽΒ» β€” Β«ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½Ρ‹ΠΉΒ». Для упрощСния ΠΈΠΌΠ΅Π½, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°Π·Π²Π°Π½Ρ‹ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ своих ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ:

int pthread_rwlock_rdlock(pthread_rwlock_t *lock);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock);

int pthread_rwlock_wrlock(pthread_rwlock_t* lock);

int pthread_rwlock_trywrlock(pthread_rwlock_t *lock);

БущСствуСт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π° Π½Π΅ Π΄Π²Π΅, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Β«ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡ‹ΠΌΠΈΒ» функциями Π±Ρ‹Π»ΠΈ pthread_rwlock_rdlock() ΠΈ pthread_rwlock_wrlock(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ «читатСлями» ΠΈ «писатСлями», соотвСтствСнно.

Π­Ρ‚ΠΎ β€” собствСнно Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹: Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° для Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ нСдоступна, ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½. Когда Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° становится доступной Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΈΠ· Ρ‡Π΅Π³ΠΎ ΠΎΠ½ смоТСт ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ спокойно ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌΡƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ рСсурсу.

Иногда, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ТСлая вмСсто этого просто ΡƒΠ·Π½Π°Ρ‚ΡŒ, доступна Π»ΠΈ нуТная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°. Для этого ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, содСрТащиС Π² ΠΈΠΌΠ΅Π½ΠΈ Β«tryΒ» (Β«ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Β»). Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Β«ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΡ‡Π½Ρ‹Π΅Β» вСрсии ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Ссли ΠΎΠ½Π° доступна, Π½ΠΎ Ссли Π½Π΅Ρ‚, Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ возвратят ΠΊΠΎΠ΄ ошибки. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Ссли ΠΎΠ½Π° доступна, ΠΎΡ‡Π΅Π½ΡŒ проста. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ, Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° окаТСтся нСдоступной. ΠŸΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_rwlock_tryrdlock(), ΠΈ оказываСтся, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° доступна. Если Π±Ρ‹ функция pthread_rwlock_tryrdlock() Π½Π΅ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π»Π° Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ нСприятныС Π²Π΅Ρ‰ΠΈ β€” наш ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠ³ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, вытСснСн Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π° Ρ‚ΠΎΡ‚, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΌΠΎΠ³ Π±Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ рСсурс. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ фактичСски Π½Π΅ Π±Ρ‹Π»Π° прСдоставлСна Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, послС возобновлСния Π΅ΠΌΡƒ придСтся Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ pthread_rwlock_rdlock(), ΠΈ Π²ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рСсурс Π±ΠΎΠ»Π΅Π΅ нСдоступСн. Π˜Π½Ρ‹ΠΌΠΈ словами, Π² Ρ‚Π°ΠΊΠΎΠΉ ситуации Π΄Π°ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊ, Π½Π΅ ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ поэтому Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Β«ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΡ‡Π½ΡƒΡŽΒ» Π²Π΅Ρ€ΡΠΈΡŽ, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½!

НаконСц, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»Π°ΡΡŒ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ способ Π΅Π΅ освобоТдСния:

int pthread_rwlock_unlock(pthread_rwlock_t* lock);

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ с рСсурсом, ΠΎΠ½ освобоТдаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_rwlock_unlock(). Если Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ становится доступной Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ ΠΈ оТидаСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ρ‚ΠΎ этот ΠΆΠ΄ΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½ Π² состояниС готовности (READY).

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

Π–Π΄ΡƒΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

Другая типовая ситуация Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… β€” это ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Β«ΠΆΠ΄Π°Ρ‚ΡŒ Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎΒ». Π­Ρ‚ΠΈΠΌ Β«Ρ‡Π΅ΠΌ- Π»ΠΈΠ±ΠΎΒ» ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ фактичСски Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ! НапримСр, ΠΊΠΎΠ³Π΄Π° доступны Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ устройства, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° конвСйСрная Π»Π΅Π½Ρ‚Π° находится Π² Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ сохранСны Π½Π° диск, ΠΈ Ρ‚.Π΄. Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° Ρ…ΠΈΡ‚Ρ€ΠΎΡΡ‚ΡŒ этой ситуации состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ события ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Для Ρ‚Π°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ (condition variable), ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅Ρ‡ΡŒ Π½ΠΈΠΆΠ΅, Π»ΠΈΠ±ΠΎ, Ρ‡Ρ‚ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, ΠΆΠ΄ΡƒΡ‰ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ (sleepon).

Для примСнСния ΠΆΠ΄ΡƒΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π½Π°Π΄ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Рассмотрим сначала Π²Ρ‹Π·ΠΎΠ²Ρ‹, Π° Π·Π°Ρ‚Π΅ΠΌ вСрнСмся ΠΊ использованию ΠΆΠ΄ΡƒΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.

int pthread_sleepon_lock(void);


int pthread_sleepon_unlock(void);


int pthread_sleepon_broadcast(void *addr);


int pthread_sleepon_signal(void *addr);


int pthread_sleepon_wait(void *addr);

He Π΄Π°ΠΉΡ‚Π΅ прСфиксу pthread_ сСбя ΠΎΠ±ΠΌΠ°Π½ΡƒΡ‚ΡŒ. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ прСдусмотрСны стандартами POSIX.

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

volatile int data_ready = 0;


consumer() {

 while (1) {

  while (!data_ready) {

   // wait

  }

  // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅

 }

}

Β«ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ» Π²Π΅Ρ‡Π½ΠΎ находится Π² своСм Π³Π»Π°Π²Π½ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ Ρ†ΠΈΠΊΠ»Π΅ (while(1)). ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ провСряСт β€” это Ρ„Π»Π°Π³ data_ready. Если этот Ρ„Π»Π°Π³ Ρ€Π°Π²Π΅Π½ 0, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Ρ‚, ΠΈ ΠΈΡ… Π½Π°Π΄ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ. ВпослСдствии ΠΏΠΎΡ‚ΠΎΠΊ-Β«ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΒ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Β«Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΡ‚ΡŒΒ» Π΅Π³ΠΎ, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ-Β«ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ состояниС Ρ„Π»Π°Π³Π° data_ready. ПолоТим, Ρ‡Ρ‚ΠΎ происходит ΠΈΠΌΠ΅Π½Π½ΠΎ это. ΠŸΠΎΡ‚ΠΎΠΊ-Β«ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ» Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ состояниС Ρ„Π»Π°Π³Π° ΠΈ опрСдСляСт, Ρ‡Ρ‚ΠΎ Ρ„Π»Π°Π³ Ρ€Π°Π²Π΅Π½ 1, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ доступны. ΠŸΠΎΡ‚ΠΎΠΊ-Β«ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ» ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…, послС Ρ‡Π΅Π³ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ снова ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ поступили Π»ΠΈ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Как Β«ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŽΒ» ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ data_ready согласованно с Β«ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌΒ»? ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π½Π°ΠΌ понадобится нСкоторая Ρ„ΠΎΡ€ΠΌΠ° монопольного доступа ΠΊ Ρ„Π»Π°Π³Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. ΠœΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² примСнСния мутСкса, Π½ΠΎ это Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ мутСкс Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΆΠ΄ΡƒΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ смоТСм ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΌΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: pthread_sleepon_lock() ΠΈ pthread_sleepon_unlock(). Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ наш ΠΏΠΎΡ‚ΠΎΠΊ-Β«ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ»:

consumer() {

 while (1) {

  pthread_sleepon_lock();

  while (!data_ready) {

   // WAIT

  }

  // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅

  data_ready = 0;

  pthread_sleepon_unlock();

 }

}

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Β«ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŽΒ» установку ΠΈ снятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ„Π»Π°Π³ data_ready, Π½Π΅ опасаясь Π³ΠΎΠ½ΠΎΠΊ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ Π΅Π³ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ.

Π’Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΠΎ! А ΠΊΠ°ΠΊ насчСт собствСнно процСсса оТидания? Как ΠΌΡ‹ ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ Ρ€Π°Π½Π΅Π΅, Ρ‚Π°ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ примСняСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_sleepon_wait(). Π’ΠΎΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ while-Ρ†ΠΈΠΊΠ»:

while (!data_ready) {

 pthread_sleepon_wait(&data_ready);

}

Ѐункция pthread_sleepon_wait() Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ выполняСт Ρ‚Ρ€ΠΈ дСйствия:

1. Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ мутСкс Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΆΠ΄ΡƒΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.

2. Π’ыполняСт собствСнно ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ оТидания.

3. Π‘Π½ΠΎΠ²Π° Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ мутСкс Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΆΠ΄ΡƒΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ/Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ мутСкса Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ проста: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡΡƒΡ‚ΡŒ мутСкса состоит Π² обСспСчСнии Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ доступа ΠΊ Ρ„Π»Π°Π³Ρƒ data_ready, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ-Β«ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽΒ» ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„Π»Π°Π³ data_ready, ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π΅Π³ΠΎ провСряСм. Но Ссли ΠΌΡ‹ Π½Π΅ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π»Π°Π³ впослСдствии, Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ-Β«ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΒ» Π½Π΅ смоТСт Π΅Π³ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Π½Π°ΠΌ ΠΎ доступности Π΄Π°Π½Π½Ρ‹Ρ…! ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ выполняСтся автоматичСски ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для удобства, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_sleepon_wait() ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ бСспокоился ΠΎ состоянии Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ послС «пробуТдСния».