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

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

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

int pthread_detach(pthread_t thread thread);

ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число 0 , Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС— ΠΊΠΎΠ΄ ошибки. Ѐункция pthread_detach() Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ, Ссли Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ thread, Π½Π΅ Π±Ρ‹Π» ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ открСплСния ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ присоСдиняСмого ΠΏΠΎΡ‚ΠΎΠΊΠ°:

pthread_create(&threadA,NULL,taskl,NULL);

pthread_detach(threadA);

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этих строк ΠΊΠΎΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊ threadA станСт ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ динамичСскому ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠ°) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ detachstate Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈ создании ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ИспользованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² инкапсулируСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для установки Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΈ ΠΈΡ… создании. Атрибутный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ pthread_attr_t. Он прСдставляСт собой структуру, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹:

β€’Β Ρ€Π°Π·ΠΌΠ΅Ρ€ стСка ΠΏΠΎΡ‚ΠΎΠΊΠ°;

‒ мСстополоТСниС стСка ΠΏΠΎΡ‚ΠΎΠΊΠ°;

‒ стратСгия планирования, наслСдованиС ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹;

β€’Β Ρ‚ΠΈΠΏ ΠΏΠΎΡ‚ΠΎΠΊΠ°: ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ присоСдиняСмый;

β€’Β ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Для Ρ‚ΠΈΠΏΠ° pthread_attr_t прСдусмотрСн ряд ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ для установки ΠΈΠ»ΠΈ считывания ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· пСрСчислСнных Π²Ρ‹ΡˆΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (см. Ρ‚Π°Π±Π». 4.3).

Для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_attr_init () ΠΈ pthread_attr_destroy () соотвСтствСнно.

Бинопсис

#include <pthread.h>

int pthread_attr_init(pthread_attr_t *attr);

int pthread_attr_destroy(pthread attr__t *attr) ;

Ѐункция pthread_attr_init () ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… для всСх этих Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ attr прСдставляСт собой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° pthread_attr_t. ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ attr-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° значСния Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, пСрСчислСнных Π² Ρ‚Π°Π±Π». 4.3. ПослС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ attr ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создания ΠΏΠΎΡ‚ΠΎΠΊΠ° pthread_create(). ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число 0, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” ΠΊΠΎΠ΄ ошибки. Ѐункция pthread_attr_init() Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ссли для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² систСмС нСдостаточно памяти.

Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_attr_destroy() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° pthread_attr_t, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr. ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ этой Ρ„ΡƒΠ½ΠΊ Ρ† ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ Π»ΡŽΠ±Ρ‹Π΅ скрытыС Π΄Π°Π½Π½Ρ‹Π΅, связанныС с этим Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число 0, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС - ΠΊΠΎΠ΄ ошибки.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π”Π» я установки Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° detachstate Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция pthread__attr_setdetachstate(). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ detachstate описываСт ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ присоСдиняСмый.

Бинопсис

#include <pthread.h>

int pthread_attr_setdetachstate(

pthread_attr_t *attr,

int *detachstate

);

int pthread_attr_getdetachstate(

const pthread_attr_t *attr,

int *detachstate

);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ detachstate ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

PTHREAD_CREATE_DETACHED

PTHREAD_CREATE_JOINABLE

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_CREATE_DETACHED Β« ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Β» всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ этот Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π² ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹Π΅, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_CREATE_JОINABLE β€” Π² присоСдиняСмыС. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_CREATE_JOINABLE Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ detachstate ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ функция pthread_attr_setdetachstate () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число 0 , Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” ΠΊΠΎΠ΄ ошибки. Π­Ρ‚Π° функция выполнится Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° detachstate окаТСтся Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

Ѐункция pthread_attr_getdetachstate () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° detachstate Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° detachstate Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ detachstate ΠΈ число 0 ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом. ΠŸΡ€ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ошибки. Π’ листингС 4.2 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»ΡΡŽΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, созданныС Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅4.1. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈ создании ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

// Листинг 4.2. ИспользованиС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для // создания ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°

int main(int argc, char *argv[]) {

pthread_t ThreadA,ThreadB;

pthread_attr_t DetachedAttr;

int N;

if(argc != 2) {

cout « «Ошибка» << endl; exit (1);

}

N = atoi(argv[1]);

pthread_attr_init(&DetachedAttr);

pthread_attr_setdetachstate(&DetachedAttr,PTHREAD_CREATE_DETACHED);

pthread_create(&ThreadA,NULL, task1, &N);

pthread_create(&ThreadB,&DetachedAttr,task2 , &N);

cout << «ОТиданиС присоСдинСния ΠΏΠΎΡ‚ΠΎΠΊΠ° А.Β» << endl; pthread_join(ThreadA,NULL);

return (0) ;

}

Π’ листингС 4.2 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ DetachedAttr, для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция pthread_attr_init(). ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° вызываСтся функция pthread_attr_detachstate(), которая измСняСт свойство detachstate (Β«ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒΒ»), установив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_CREATE_DETACHED (Β«ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½ΠΎΡΡ‚ΡŒΒ»). ΠŸΡ€ΠΈ создании ΠΏΠΎΡ‚ΠΎΠΊΠ° ThreadB с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_create() Π² качСствС Π΅Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ DetachedAttr. Для ΠΏΠΎΡ‚ΠΎΠΊΠ° ThreadB Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_join() Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ

Боздавая ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, использованиС ΠΈΠΌΠΈ рСсурсов ΠΈ состязаниС Π·Π° рСсурсы. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΏΠΎ большСй части осущСствляСтся ΠΏΡƒΡ‚Π΅ΠΌ установки стратСгий планирования ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°. Π­Ρ‚ΠΈ Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρ‹ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠšΡ€ΠΎΠΌΠ΅ Π½ΠΈΡ…, ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСтся Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡΠΎΡΡ‚ΡΠ·Π°ΡŽΡ‚ΡΡ Π·Π° рСсурсы: Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Π»ΠΈΠ±ΠΎ Π² ΠΌΠ°ΡΡˆΡ‚Π°Π±Π΅ всСй систСмы. Π‘Ρ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ планирования, ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ рСсурсы, доступ ΠΊ Π½ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚Ρƒ Ρ‚Π΅ΠΌΡƒ ΠΌΡ‹ ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π·Π°Ρ‚Ρ€ΠΎΠ½Π΅ΠΌ Π² этой Π³Π»Π°Π²Π΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎβ€” Π² Π³Π»Π°Π²Π΅ 5. К вопросам синхронизации Ρ‚Π°ΠΊΠΆΠ΅ относятся ΠΈ Ρ‚Π°ΠΊΠΈΠ΅: Π³Π΄Π΅ ΠΈ ΠΊΠ°ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ ΠΈ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΈ.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Π²Π°Π½ΠΎ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:

β€’Β Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· процСсса с Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ ΠΈΠΌ статусом Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ (ΠΈΠ»ΠΈ Π±Π΅Π· Π½Π΅Π³ΠΎ);

β€’Β Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ собствСнного Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈ прСдоставлСния статуса Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ;

β€’Β Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ аннулирования Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ адрСсном пространствС.

Π—Π°Π²Π΅Ρ€ΡˆΠ°ΡΡΡŒ, функция присоСдинСния ΠΏΠΎΡ‚ΠΎΠΊΠ° pthread_join() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ статус Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_exit(), которая Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Если Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉΡΡ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ обращался ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_exit (), Ρ‚ΠΎ Π² качСствС статуса Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π±ΡƒΠ΄Π΅Ρ‚ использовано Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Ссли ΠΎΠ½ΠΎ сущСствуСт; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС статус Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π²Π΅Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ NULL. [9] Π’ΠΎΠ· ΠΌΠΎΠΆΠ½Π° ситуация, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ процСссС. НапримСр, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Если окаТСтся, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Β«ΠΏΠ»ΠΎΡ…ΠΎ сСбя Π²Π΅Π΄Π΅Ρ‚Β», ΠΈΠ»ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Ρ‚ΠΎ Ρ€Π°Π΄ΠΈ экономии систСмных рСсурсов, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ. Π—Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉΡΡ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΈΠ»ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ достигнСт Π² своСм Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ логичСской Ρ‚ΠΎΡ‡ΠΊΠΈ. ΠŸΡ€ΠΈ этом Π²ΠΏΠΎΠ»Π½Π΅ вСроятно, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дСйствия ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ-Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π°. ΠŸΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.