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

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

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

ΠŸΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Π² Ρ‚ΠΎ врСмя, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π±Ρ‹Π» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_timedwait() ΠΈΠ»ΠΈ pthread_cond_wait (), Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ условный сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π½Π° ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ссли ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ этой условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Ѐункция pthread_cond_timedwait() эквивалСнтна Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_wait (), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ошибки, Ссли Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ врСмя, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎ ΠΌ abstime, наступит (Ρ‚.Π΅. систСмноС врСмя станСт Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ прСвысит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ abstime) Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сигнала) условиС cond, ΠΈΠ»ΠΈ Ссли Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ врСмя, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ abstime, ΡƒΠΆΠ΅ наступило Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π°.

C S Если поддСрТиваСтся опция Clock Selection, условная пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ часов, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ abstime . По истСчСнии Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ функция pthread_cond_timedwait() освободит ΠΈ снова Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, адрСсуСмый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ mutex . Ѐункция pthread_cond_timedwait () Ρ‚Π°ΠΊΠΆΠ΅ прСдставляСт собой Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹.

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

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π° ошибки [ETIMEDOUT], всС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ошибок Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π² самом Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ ΠΊΠΎΠ΄ ошибки Π² случаС Π΅Π΅ обнаруТСния возвращаСтся Π΄ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ состояния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎ ΠΌ mutex, ΠΈΠ»ΠΈ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ cond.

ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ возвращаСтся Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” ΠΊΠΎΠ΄ ошибки, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π΅Π΅ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€.

Ошибки

Ѐункция pthread_cond_timedwait () Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ, Ссли:

[ETIMEDOUT] Β Π²Ρ€Π΅ ΠΌ я, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎ ΠΌ abstime, наступило.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_timedwait() ΠΈ pthread_cond_wait() ΠΌ ΠΎΠ³ΡƒΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ, Ссли:

[EINVAL] Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΈ ΠΌ ΠΈΠ· ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎΠ² cond, mutex ΠΈΠ»ΠΈ abstime, Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ;

[EINVAL] для выполнСния ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ pthread_cond_timedwait() ΠΈΠ»ΠΈ pthread_cond_wait () ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ условной ΠΏΠ΅Ρ€Π΅ ΠΌ Π΅Π½Π½ΠΎΠΉ Π±Ρ‹Π»ΠΈ задСйствованы Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹;

[EPERM] Β Π²ΠΎ Π²Ρ€Π΅ ΠΌ я Π²Ρ‹Π·ΠΎΠ²Π° любой ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ Π½Π΅ Π²Π»Π°Π΄Π΅Π» Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΊΠΎΠ΄ ошибки [EINTR].

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚.

ЗамСчания ΠΏΠΎ использованию

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚.

ЛогичСскоС обоснованиС

Π‘Π΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠ° оТидания ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ

Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ ΠΌ Π΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_wait() ΠΈ pthread_cond_timedwait() Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ Π±Π΅Π· ошибки, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ Ρ‰ ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ всС Π΅Ρ‰Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π»ΠΎΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Аналогично, ΠΊΠΎΠ³Π΄Π° функция pthread_cond_timedwait() возвращаСтся с ошибкой истСчСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ оТидания, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ истинноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·-Π·Π° Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎΠΉ Β«Π³ΠΎΠ½ΠΊΠΈΒ» ΠΌΠ΅ΠΆΠ΄Ρƒ истСчСниСм ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° оТидания ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ состояния ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… рСализациях, Π² частности ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½Ρ‹Ρ…, ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ссли сигнал ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ состояния условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ гСнСрируСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… процСссорах.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ оТидания ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°, связанного с ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΎΠ½ бСзопасно ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚. Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· состояния оТидания Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π›ΠžΠ–Π¬ ΠΈΠ»ΠΈ ИБВИНА).

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ рСкомСндуСтся ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ Π²Ρ‹Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅, эквивалСнтно ΠΌ Ρ†ΠΈΠΊΠ»Ρƒ Β«whileΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°.

Π‘Π΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠ° оТидания ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

ΠΠ±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ врСмя Π±Ρ‹Π»ΠΎ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ для задания ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π»ΠΈΠΌΠΈΡ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎ Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ задаСтся Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ врСмя, с Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая опрСдСляСт ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя, связано условиС Β«Π³ΠΎΠ½ΠΎΠΊΒ». ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ функция clock_gettime() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя, Π° функция cond_relative_timed_wait () ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя.

clock_gettime(CLOCK_REALTIME, &now)

reltime = sleep_til_this_absolute_time -now;

cond_relative_timed_wait (с, m, &reltime);

Если ΠΏΠΎΡ‚ΠΎΠΊ выгруТаСтся ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ послСднСй инструкциями, ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся слишком Π½Π°Π΄ΠΎΠ»Π³ΠΎ. Однако Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ нСсущСствСнно, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ врСмя. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ врСмя Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ссли ΠΎΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅ нСсколько Ρ€Π°Π·.

Для случаСв, ΠΊΠΎΠ³Π΄Π° систСмныС часы Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ дискрСтно, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π»ΡŽΠ±Ρ‹Π΅ оТидания ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈΡΡ‚Π΅ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ дискрСтными состояниями, Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π½ΡƒΠΆΠ½ΠΎΠ΅ врСмя ΡƒΠΆΠ΅ наступило.

АннулированиС ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ

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

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

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² случаС, ΠΊΠΎΠ³Π΄Π° запрос Π½Π° ΠΎΡ‚ΠΌΠ΅Π½Ρƒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π²ΠΎ врСмя оТидания, Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ состояния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° опрСдСлСнная инструкция, ΠΏΡ€ΠΈ этом Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сдСлаСт ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ прилоТСния Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΈ свободным ΠΎΡ‚ ошибок.

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ дСйствий, связанных с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌ запроса Π½Π° ΠΎΡ‚ ΠΌ Π΅Π½Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Ρ‚ΠΎ Π²Ρ€Π΅ ΠΌ я, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎ условной ΠΏΠ΅Ρ€Π΅ ΠΌ Π΅Π½Π½ΠΎΠΉ, рСализация Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· условных сигналов, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π½Π° ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ссли ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ сигнала ΠΏΠΎ этой условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. БоблюдСниС этого ΠΏΡ€Π°Π²ΠΈΠ»Π° позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ условий Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π² случаС, Ссли Π΄Π²Π° нСзависимых запроса (ΠΎΠ΄ΠΈΠ½ дСйствуСт Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ связан с условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ) Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ нСзависимо.