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

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

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

6:  [0000000]->[0001505] ... [0002007]->[0002007]

7:  [0000000]->[0002007] ... [0002508]->[0002508]

8:  [0000000]->[0002508] ... [0003010]->[0003010]

9:  [0000000]->[0003010] ... [0003512]->[0003512]

10: [0000000]->[0003512] ... [0004014]->[0004014]

11: [0000000]->[0004014] ... [0004516]->[0004516]

12: [0000000]->[0004516] ... [0005017]->[0005018]

3:  [0005501]->[0005501] ... [0006003]->[0006003]

5:  [0008024]->[0008024] ... [0008526]->[0008526]

7:  [0008038]->[0008526] ... [0009028]->[0009028]

4:  [0009273]->[0009273] ... [0009775]->[0009775]

6:  [0010377]->[0010377] ... [0010878]->[0010878]

8:  [0010590]->[0010878] ... [0011380]->[0011380]

9:  [0010952]->[0011380] ... [0011882]->[0011882]

12: [0011297]->[0011882] ... [0012384]->[0012384]

11: [0011356]->[0012384] ... [0012886]->[0012886]

10: [0012024]->[0012886] ... [0013387]->[0013388]

3:  [0012874]->[0013388] ... [0013889]->[0013889]

7:  [0014888]->[0014888] ... [0015390]->[0015390]

4:  [0016254]->[0016254] ... [0016756]->[0016756]

5:  [0017646]->[0017646] ... [0018148]->[0018148]

6:  [0019088]->[0019088] ... [0019590]->[0019590]

11: [0020206]->[0020206] ... [0020708]->[0020708]

8:  [0020320]->[0020708] ... [0021210]->[0021210]

10: [0021078]->[0021210] ... [0021712]->[0021712]

12: [0021384]->[0021712] ... [0022213]->[0022213]

7:  [0021630]->[0022213] ... [0022715]->[0022715]

9:  [0021811]->[0022715] ... [0023217]->[0023217]

3:  [0022009]->[0023217] ... [0023719]->[0023719]

ДинамичСский ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ДинамичСский ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ являСтся ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ спСцифичСским ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ, ΠΏΡ€ΠΎΠ΄ΠΈΠΊΡ‚ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ микроядСрной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ QNX. Π­Ρ‚ΠΎ удачная искусствСнная конструкция, всС опрСдСлСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅ <sys/dispatch.h>. Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² составС API QNX имССтся Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ инструмСнты ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ОБ.

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

ДинамичСский ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½ΡƒΠΆΠ΅Π½ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ QNX Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΊΠ°ΠΊ инструмСнт построСния ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² рСсурсов - основы построСния сСрвисов ОБ QNX. Но ΠΈ ΠΏΠΎΠΌΠΈΠΌΠΎ этой Ρ†Π΅Π»ΠΈ динамичСский ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² прСдставляСт собой ΠΌΠΎΡ‰Π½Π΅ΠΉΡˆΠ΅Π΅ срСдство для конструирования ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ динамичСского ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π½Π°ΠΌΠΈ описан Π² ΠΊΠ½ΠΈΠ³Π΅ [4] Π² Π³Π»Π°Π²Π΅ Β«Π‘Π΅Ρ€Π²Π΅Ρ€ TCP/IP... ΠΌΠ½ΠΎΠ³ΠΎ сСрвСров Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ…Β». По сути, это Ρ€Π΅Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ TCP/IP-сСрвСр, Π½ΠΎ сСйчас это для нас Π½Π΅Π²Π°ΠΆΠ½ΠΎ:

Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π° Π±Π°Π·Π΅ динамичСского ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

#include <pthread.h>

#include <sys/dispatch.h>


static int ls; // ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ TCP-сокСт


THREAD_POOL_PARAM_T* alloc(THREAD_POOL_HANDLE_T* h) {

 return (THREAD_POOL_PARAM_T*)h;

}


// функция блокирования ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

THREAD_POOL_PARAM_T* block(THREAD_POOL_PARAM_T* p) {

 int rs = accept(ls, NULL, NULL);

 if (rs < 0) errx("accept error");

 return(THREAD_POOL_PARAM_T*)rs;

}


int handler(THREAD_POOL_PARAM_T* p) {

 retrans((int)p);

 close((int)p);

 delay(250);

 cout << pthread_self() << flush;

 return 0;

}


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

 // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ TCP-сокСт Π½Π° ΠΏΠΎΡ€Ρ‚

 ls = getsocket(THREAD_POOL_PORT);

 // созданиС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:

 thread_pool_attr_t attr;

 memset(&attr, 0, sizeof(thread_pool_attr_t));

 // Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΡƒΠ»Π°

 /* - mm число Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΏΡƒΠ»Π΅ */

 attr.lo_water = 3;

 /* - max число Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΏΡƒΠ»Π΅ */

 attr.hi_water = 7;

 /* - ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ шага создания ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² */

 attr.increment = 2;

 attr.maximum = 9;


 /* - ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€Π΅Π΄Π΅Π» числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΏΡƒΠ»Π΅ */

 attr.handle = dispatch_create();

 attr.context_alloc = alloc;

 attr.block_func = block;

 attr.handler_func = handler;

 // фактичСскоС созданиС ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:

 void* tpp = thread_pool_create(&attr, POOL_FLAG_USE_SELF);

 if (tpp == NULL) errx("create pool");

 // Π½Π°Ρ‡Π°Π»ΠΎ функционирования ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:

 thread_pool_start(tpp);

 // ... Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠΉΠ΄Π΅Ρ‚ Π΄ΠΎ этой Ρ‚ΠΎΡ‡ΠΊΠΈ!

 exit(EXIT_SUCCESS);

}

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

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ сущСствСнны для понимания ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° сточки зрСния функционирования ΠΏΡƒΠ»Π°:

β€’ errx() β€” рСакция Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ выполнСния с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ сообщСния ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π°Π²Π°Ρ€ΠΈΠΉΠ½Ρ‹ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ;

β€’ retrans() β€” ΠΏΡ€ΠΈΠ΅ΠΌ сообщСния с присоСдинСнного TCP-сокСта с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ рСтрансляциСй ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ содСрТимого Π² Π½Π΅Π³ΠΎ ΠΆΠ΅.

Π˜Ρ‚Π°ΠΊ, пСрвая ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ построили ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ сСрвСр, ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ прописывая собствСнного ΠΊΠΎΠ΄Π°, β€” Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€ΡƒΡ‚ΠΈΠ½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π·Π° нас сдСлала Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΡƒΠ»Π°.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ описаниС Π»ΠΎΠ³ΠΈΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° самом качСствСнном, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅:

β€’ ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ (ΠΏΡ€ΠΈ запускС ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ€Π°Π±ΠΎΡ‚Ρƒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ thread_pool_start()) создаСтся attr.lo_water ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² («ниТняя ватСрлиния» числа Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²).

β€’ ΠŸΡ€ΠΈ создании любого ΠΏΠΎΡ‚ΠΎΠΊΠ° (ΠΊΠ°ΠΊ Π² процСссС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΈ Π² процСссС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ создания) вызываСтся функция attr.соntext_alloc() (Π² контСкстС созданного ΠΏΠΎΡ‚ΠΎΠΊΠ°).

β€’ ΠŸΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠ° attr.block_func(), Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ созданный ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ события Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ (Π² ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ событиС Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” это установлСниС соСдинСния Π½ΠΎΠ²Ρ‹ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΏΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Ρƒ ΠΈΠ· accept()).

β€’ Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π°Ρ функция послС наступлСния события Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π² состояниС READY ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Π² контСкстС этого ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° attr.handler_func().

β€’ Π•сли послС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ шага число ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² станСт Π½ΠΈΠΆΠ΅ attr.lo_water, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΡƒΠ»Π° создаст Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ attr.increment ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Β«Π΄ΠΎΠ²Π΅Π΄Π΅Ρ‚Β» ΠΈΡ… Π΄ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

β€’ ΠΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ всю ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, ΠΏΡ€Π΅Π΄ΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΈ послС выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½ Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ блокирования…

β€’ β€¦Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ° вновь Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС провСряСтся, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΏΡ€ΠΈ этом ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΎ число Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² attr.hi_water («вСрхняя ватСрлиния»), ΠΈ Ссли это ΠΈΠΌΠ΅Π΅Ρ‚ мСсто, Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ вмСсто ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС самоуничтоТаСтся.

β€’ Π’сС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ числа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² производятся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ‰Π΅Π΅ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡƒΠ»Π° (Ρ‚. e. число Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² вмСстС с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ) Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π»ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ attr.maximum.

Π Π°Π·ΠΎΠ±Ρ€Π°Π² ΠΎΠ±Ρ‰ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ функционирования ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Π΅Π΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ шаги всСго процСсса:

1. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΡƒΡŽ запись, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΡƒΡŽ всС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ»Π°. Атрибутная запись описана Ρ‚Π°ΠΊ (<sys/dispatch.h>):

typedef struct _thread_pool_attr {

 THREAD_POOL_HANDLE_T* handle;

 THREAD_POOL_PARAM_T*

 (*block_func)(THREAD_POOL_PARAM_T* ctp);

 void (*unblock_func)(THREAD_POOL_PARAM_T* ctp);

 int (*handler_func)(THREAD_POOL_PARAM_T* ctp);

 THREAD_POOL_PARAM_T*

  (*context_alloc)(THREAD_POOL_HANDLE_T* handle);

 void (*context_free)(THREAD_POOL_PARAM_T* ctp);

 pthread_attr_t* attr;

 unsigned short lo_water;

 unsigned short increment;

 unsigned short hi_water;

 unsigned short maximum;

 unsigned reserved[8];

} thread_pool_attr_t;

ДСскриптор создаваСмого ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² handle, посрСдством ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΡƒΠ», являСтся просто синонимом Ρ‚ΠΈΠΏΠ° dispatch_t:

#ifndef THREAD_POOL_HANDLE_T

 #define THREAD_POOL_HANDLE_T dispatch_t

#endif

Атрибуты ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² составС ΠΏΡƒΠ»Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ»Π΅ΠΌ attr Ρ‚ΠΈΠΏΠ° pthread_attr_t (эту структуру ΠΌΡ‹ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ рассматривали Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈ обсуТдСнии создания Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²).

ЧислСнныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡƒΠ»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚:

lo_water β€” «ниТняя ватСрлиния», минимальноС число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡƒΠ»Π°, находящихся Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ состоянии (Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ). Если Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ события ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ число ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² становится мСньшС lo_water, создаСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ increment ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСводятся Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС.

hi_water β€” максимальноС число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ допустимо ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ состоянии. Если послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ число Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² становится большС hi_water, Ρ‚ΠΎ этот ΠΏΠΎΡ‚ΠΎΠΊ уничтоТаСтся.