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

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

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

Для осущСствлСния синхронизации ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сама условная пСрСмСнная cond. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ссылки Π½Π° ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ΅Ρ€Π΅ ΠΌ Π΅Π½Π½ΠΎΠΉ cond Π² обращСниях ΠΊ функциям pthread_cond_wait(), pthread_cond_timedwait(), pthread_cond_signal(), pthread_cond_broadcast() ΠΈ pthread_cond_destroy() Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ повСдСнию.

Если Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ статичСски, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макрос PTHREAD_COND_INITIALIZER. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² это ΠΌ случаС эквивалСнтСн Π΄ΠΈΠ½Π° ΠΌ ичСской ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚Π΅ ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_init () с ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎ ΠΌ attr, Ρ€Π°Π²Π½Ρ‹ ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ NULL, Π½ΠΎ Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ошибок.

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

ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_destroy() ΠΈ pthread_cond_init() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎ ΠΌ случаС— ΠΊΠΎΠ΄ ошибки, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π΅Π΅ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ошибок с ΠΊΠΎΠ΄Π°ΠΌΠΈ [EBUSY] ΠΈ [EINVAL] Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Ρ‚Π°ΠΊ (Ссли Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠΎΠ±Ρ‰Π΅), ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½Π° выполняСтся Π² самом Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ ΠΊΠΎΠ΄ ошибки Π² случаС Π΅Π΅ обнаруТСния возвращаСтся Π΄ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ состояния условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ cond.

Ошибки

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

[EBUSY] рСализация ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, адрСсуСмый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ cond, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ относится ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ использовании Π² функциях pthread_cond_wait() ΠΈΠ»ΠΈ pthread_cond_timedwait ());

[EINVAL] Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎ ΠΌ cond, Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.

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

[EAGAIN] систСма испытываСт нСдостаток Π² рСсурсах (Π½Π΅ имССтся Π² Π²ΠΈΠ΄Ρƒ ΠΏΠ°ΠΌΡΡ‚ΡŒ), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ;

[ENOMEM] для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ нСдостаточно ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ памяти.

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

[EBUSY] рСализация ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, адрСсуСмый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ cond, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π» Ρ€Π°Π½Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, Π½ΠΎ Π΅Ρ‰Π΅ Π½Π΅ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½;

[ EINVAL ] Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Π°ttr, Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.

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

Π£ΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ ΠΌ Π΅Π½Π½ΡƒΡŽ ΠΌ ΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ сразу послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Π½Π΅ΠΉ. Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄.

struct list {

pthread_mutex_t lm;

}

struct elt {

key k;

int busy;

pthread_cond_t notbusy;

}

/* Находим элСмСнт списка ΠΈ сохраняСм Π΅Π³ΠΎ. */

struct elt * list_find (struct list *lp, key k) {

struct elt *ep;

pthread_mutex_lock (&lp->lm);

while ((ep = find_elt (1, ΠΊ) ! = NULL) && ep->busy)

pthread_cond_wait (&ep->notbusy, &lp->lm);

if (Π΅Ρ€ != NULL) ep->busy = 1;

pthread_mutex_unlock (&lp->lm) ;

return (Π΅Ρ€);

}

delete_elt (struct list *lp, struct elt *ep) {

pthread_mutex_lock (&lp->lm);

assert (ep->busy);

//... удаляСм элСмСнт Π΅Ρ€ ΠΈΠ· списка …

ep->busy = 0; /* Paranoid. */

(A)Β pthread_cond_broadcast (&ep->notbusy);

pthread_mutex_unlock (&lp->lm);

(B)Β pthread_cond_destroy (&rp->notbusy);

free (Π΅Ρ€);

}

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

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

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

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

Π‘ ΠΌ. Ρ€Π°Π·Π΄Π΅Π» «ЛогичСскоС обоснованиС» Π² описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_mutex_init ().

Π‘ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅ направлСния

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

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

pthread_cond_broadcast (), pthread_cond_signal (), pthread_cond_timedwait (), Ρ‚ΠΎ ΠΌ Base Definidons стандартаШЕЕStd 1003.1-2001, <pthread.h>.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² выпускС Issue 5. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ для согласования с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΌ POSIX Threads Extension.

Issue 6

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_destroy() ΠΈ pthread_cond_init() ΠΎΡ‚ ΠΌ Π΅Ρ‡Π΅ Π½ Ρ‹ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΈ Threads.

Π Π°Π·Π΄Π΅Π» «ОписаниС» Π±Ρ‹Π» ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΡƒΡ‚Π΅ ΠΌ ΠΏΡ€ΠΈ ΠΌ СнСния ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ IEEE PASC Interpretation 1003.1с #34.

Π’ цСлях согласования со стандарто ΠΌ ISO/IEC 9899:1999 Π² ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_init () Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово restrict.

pthread_cond_timedwait, pthread_cond_wait

Имя

pthread_cond_timedwait, pthread_cond_wait β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания условия.

Бинопсис

THR

#include <pthread.h>

int pthread_cond_timedwait ( pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);

int pthread_cond_wait (pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

ОписаниС

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_timedwait() ΠΈ pthread_cond_wait() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для блокирования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Они Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ с использованиСм ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° mutex , Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.

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

ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, Π° Π²Π»Π°Π΄Π΅Ρ‚ΡŒ ΠΈΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

ΠŸΡ€ΠΈ использовании условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… всСгда сущСствуСт Π±ΡƒΠ»Π΅Π² ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ этими ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ условиСм. Π­Ρ‚ΠΎ условиС становится истинным, Ссли ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pthread_cond_timedwait() ΠΈΠ»ΠΈ pthread_cond_wait () Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ запуски. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΎΡ†Π΅Π½ΠΊΠΈ значСния упомянутого Π²Ρ‹ΡˆΠ΅ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

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

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