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, ΡΠΎ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅ΡΡΡ.