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

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

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

EINVAL
β€” Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° пСрСмСнная, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚
cond
.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ условия для всСх ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

int pthread_cond_broadcast(pthread_cond_t* cond);

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

cond
. ΠŸΠΎΡ‚ΠΎΠΊΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² порядкС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². Для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ€Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ проводится Π² порядкС FIFO.

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

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

EFAULT
β€” ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ обращСния ΠΊ указатСлям
cond
ΠΈΠ»ΠΈ
mutex
;

EINVAL
β€” Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° пСрСмСнная, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚
cond
.

Π Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

int pthread_cond_destroy(pthread_cond_t* cond);

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

cond
. Для дальнСйшСго использования условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ссылаСтся
cond
, Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ
pthread_cond_init()
. Ѐункция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для измСнСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

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

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

EBUSY
β€” Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ
cond
;

EINVAL
β€” Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° пСрСмСнная
cond
.

Ждущая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°

QNX прСдоставляСт ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для блокирования (остановки) ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ интСрфСйса Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΆΠ΄ΡƒΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ( sleepon). Для использования этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² синхронизации, Π·Π° вас это Π΄Π΅Π»Π°Π΅Ρ‚ ОБ. Π’Π½Π΅ΡˆΠ½Π΅ ΠΆΠ΄ΡƒΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ выглядят ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ оТидания ΠΈ освобоТдСния, ΠΏΡ€ΠΈ этом ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° использованию ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² ΠΈ условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

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

ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со ΠΆΠ΄ΡƒΡ‰ΠΈΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅

<pthread.h>
.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со ΠΆΠ΄ΡƒΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ

Π—Π°Ρ…Π²Π°Ρ‚ ΠΈ освобоТдСниС ΠΆΠ΄ΡƒΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ оТидания ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΈ освобоТдСния ΠΆΠ΄ΡƒΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ:

int pthread_sleepon_lock(void);

int pthread_sleepon_unlock(void);

Ѐункция Π·Π°Ρ…Π²Π°Ρ‚Π°

pthread_sleepon_lock()
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

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

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

EAGAIN
β€” ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Π² процСссС, Ссли систСмС Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ рСсурсов для создания Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

Ѐункция освобоТдСния

pthread_sleepon_unlock()
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ значСния:

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

EPERM
β€” Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ являСтся Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания

ОТиданиС выполнСния условия для ΠΆΠ΄ΡƒΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ…: простоС ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ с установкой Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°.

int pthread_sleepon_wait(const volatile void* addr);

int pthread_sleepon_timedwait(const volatile void* addr, uint64_t nsec);

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ оТидания Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡

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

ОТиданиС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°

ОТиданиС Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΈΠΌ «присоСдинСнных» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Π½Π° Π²Ρ‹Π·ΠΎΠ²Π΅

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

void* threadfunc(void* data) {

Β ...

Β return NULL;

}

...

// здСсь создаСтся Π½ΡƒΠΆΠ½ΠΎΠ΅ количСство (N) ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:

pthread_t tid[N];

for (int i = 0; i < N; i++)

Β pthread_create(tid + 1, NULL, threadfunc, NULL);

// Π° Π²ΠΎΡ‚ здСсь оТидаСтся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ <b>всСх</b>ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²!

for (int i = 0; i &lt; N; i++)

Β pthread_join(tid + 1, NULL);

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ знакомствС с ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ шаблоном ΠΊΠΎΠ΄Π° ΠΏΡƒΠ³Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ, Ρ‡Ρ‚ΠΎ прСдписан Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ порядок оТидания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΈ ΠΈΡ… создании. И это ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ порядок ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ. Но прСдставлСнный шаблон Π²Π΅Ρ€Π΅Π½: Ссли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠΎΡ‚ΠΎΠΊ

j
«задСрТиваСтся», Π° ΠΌΡ‹ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ
tid[j]
, Ρ‚ΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ этого ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ всС-Ρ‚Π°ΠΊΠΈ наступит, ΠΌΡ‹ Β«ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΒ» ΠΏΡ€ΠΎΠ±Π΅Π³Π°Π΅ΠΌ всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅
i
, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅
tid[i]
ΡƒΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈΡΡŒ Ρ€Π°Π½Π΅Π΅. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ прСдставлСнный шаблон ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½ ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

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

Π’ Ρ‚Π°ΠΊΠΎΠΉ схСмС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π² Ρ‚ΠΎΡ‡ΠΊΡƒ оТидания (ΠΈ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π΄Π΅Π»Π°ΡŽΡ‚ это) Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ своСго выполнСния. Π’ прСдставлСнном шаблонС ΠΌΡ‹ Π½Π΅ стали ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄. Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассматривался Ρ€Π°Π½Π΅Π΅, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ шла ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².