Β // ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ.
Β static iofunc_attr_t attr;
Β iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);
Β // Π·Π΄Π΅ΡΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΡΡΠ΅Π²ΠΎΠ΅ ΠΈΠΌΡ Π΄Π»Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°
Β id = resmgr_attach(dpp, &resmgr_attr, "/dev/prior",
Β _FTYPE_ANY, 0, &connect_funcs, &io_funcs, &attr);
Β if (id == -1)
Β perror("attach name"), exit(EXIT_FAILURE);
Β ctp = dispatch_context_alloc(dpp);
Β // ΡΡΠ°ΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊΠ°ΠΊ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ» ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ
Β // ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΡ
ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ:
Β while (true) {
Β if ((ctp = dispatch_block(ctp)) == NULL)
Β Β perror("block error"), exit(EXIT_FAILURE);
Β dispatch_handler(ctp);
Β }
}ΠΠ΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°. ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΎΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
read()open()read()
# prior &
# ls -l /dev/pr*
nrw-rw-rw- 1 root root 0 Dec 18 17:13 /dev/priorΠΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π½Π°ΡΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡΠΌ: ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ΅ΡΡΡΡΠ° Π·Π°ΠΏΡΡΠ΅Π½, ΠΎΠ½ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π» Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½ ΡΠ²ΠΎΠ΅ ΠΈΠΌΡ
/dev/prior
# cat /dev/prior
10
# nice -n-5 cat /dev/prior
15
# nice -n-19 cat /dev/prior
29ΠΠΎΡ Π·Π΄Π΅ΡΡ ΠΈ ΠΏΡΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΌΠΎΡΡ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΡΠ΅ΡΡΡΡΠ°: ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ½Π°Ρ ΡΠ»ΡΠΆΠ±Π° Β«ΠΊΠ°ΠΌΡΡΠ»ΠΈΡΡΠ΅ΡΒ» ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΉ QNX-ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΌΠΈΠΊΡΠΎΡΠ΄ΡΠ° ΠΏΠΎΠ΄ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ POSIX-Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ (
open()read()read()Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠ°ΠΌΠ°Π½ΡΡΠ²Π° Β«ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°Β» Π² ΠΎΠ±Π»Π°ΡΡΡ Π΄Π΅ΡΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°, Π΄Π° ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈΠ²ΡΡΠ½ΡΠΌΠΈ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π‘++.
ΠΠΎΠ»ΡΠ·ΡΡΡΡ ΡΠ»ΡΡΠ°Π΅ΠΌ, ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π΄Π΅ΡΡ ΡΠΌΠ΅ΡΡΠ½ΠΎ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π³ΠΈΠ±ΠΊΠΎΡΡΡ ΠΌΠΈΠΊΡΠΎΡΠ΄Π΅ΡΠ½ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΈ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΡΠ΅ΡΡΡΡΠ°, Π° Π·Π°ΠΎΠ΄Π½ΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ² (ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π°ΠΆΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ) ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΠΎΡΠ΅ ΠΊ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΡ ΡΠ΅ΡΡΡΡΠ°, Π·Π°ΠΏΡΡΠ΅Π½Π½ΠΎΠΌΡ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ ΡΠ·Π»Π΅ ΡΠ΅ΡΠΈ (ΠΈΠΌΡ ΡΠ·Π»Π° β
rtp
# on -frtp prior &
# ls -l /net/rtp/dev/pr*
nrw-rw--rw- 1 root root 0 Dec 18 17.09 /net/rtp/dev/prior
# nice -n-5 cat /net/rtp/dev/prior
15
# nice -n-19 cat /net/rtp/dev/prior
29ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ² Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠ»ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΌ Π²ΡΡΠ΅.
Π Π΅Π°Π»ΡΠ½ΡΠΉ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Ρ ΡΠΎΠΏΡΡΡΡΠ²ΡΡΡΠΈΠΌ Π΅ΠΌΡ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΠ½ΡΠΌ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΡΡ Π½Π°ΠΌΠΈ Π² ΠΊΠ½ΠΈΠ³Π΅ [4] Π² Π³Π»Π°Π²Π΅ Β«ΠΡΠ°ΠΉΠ²Π΅ΡΡΒ». ΠΡ Π½Π΅ ΡΡΠ°Π½Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ Π·Π΄Π΅ΡΡ ΡΡΠΎΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠ±ΡΠ΅ΠΌΠ½ΡΠΉ ΡΠ΅ΠΊΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΡΠ°Π½Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ ΠΏΠΎΡΠ»Π΅ Π²ΠΎΡ ΡΡΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΏΡΠ΅ΡΠΈΠΊΡΠ° ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°:
// Π·Π΄Π΅ΡΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΡΡΠ΅Π²ΠΎΠ΅ ΠΈΠΌΡ Π΄Π»Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°
id = resmgr_attach(dpp, &resmgr_attr, "/dev/prior",
Β _FTYPE_ANY, 0, &connect_funcs, &io_funcs, &attr);
if (id == -1)
Β perror("attach name"), exit(EXIT_FAILURE);ΠΠΎΡ ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ:
...
thread_pool_attr_t pool_attr;
memset(&pool_attr, 0, sizeof pool_attr);
pool_attr.handle = dpp;
// ΡΡΠΎ Π²ΡΠ΅Π³Π΄Π° ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊ ...:
pool_attr.context_alloc = dispatch_context_alloc;
pool_attr.block_func = dispatch_block;
pool_attr.handler_func = dispatch_handler;
pool_attr.context_free = dispatch_context_free;
// ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΡΠ»Π°:
pool_attr.lo_water = 2;
pool_attr.hi_water = 6;
pool_attr.increment = 1;
pool_attr.maximum = 50;
thread_pool_t *tpp;
// ΡΠ»Π°Π³ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
// POOL_FLAG_EXIT_SELF, POOL_FLAG_USE_SELF ΠΈΠ»ΠΈ,