ΠΡΠΎΠ±Π°Ρ ΠΎΠ±Π»Π°ΡΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠΎΠ³ΡΡ Π½Π°ΠΉΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ Π³Π΄Π΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ (ΡΡΠ΅ΠΊΠΎΠ²ΡΠ΅) ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ° Π½Π΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ, β ΡΡΠΎ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠ΄Π° Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π°.
ΠΡΠ΅ ΠΎΠ΄Π½ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ° (ΠΌΡ Π½Π΅ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΈ Π² Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠΉ ΠΎ Π½Π΅ΠΌ), ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΡΠΎΠ±ΠΎ ΠΎΡΠ³Π°Π½ΠΈΡΠ½ΠΎ Π²ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π‘++, β ΡΡΠΎ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΏΠΎΡΠΎΠ± Π²ΠΎΠ·Π²ΡΠ°ΡΠ° Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΡΠ°Π±ΠΎΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ . ΠΡΠΈ ΡΡΠΎΠΌ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ - ΠΊΠ°ΠΊ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠ΅ (ΠΌΡ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΠΈ ΡΡΠΎ ΡΠ°Π½Π΅Π΅); ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π·Π°ΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΌΠ΅ΡΠ΅ Π½ΠΈΠ²Π΅Π»ΠΈΡΡΠ΅Ρ ΠΈΡ ΡΠ°Π·Π½ΠΈΡΡ. ΠΡΠ° ΡΠ΅Ρ Π½ΠΈΠΊΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ:
β’ ΠΡΠ»ΠΈ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠ»ΡΡΠ° Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ° pthread_key_create(..., NULL), ΡΠΎ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π½Π°Π΄ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΡ Π½Π΅ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Π΅ΡΡΡΡΠΊΡΠΈΠ²Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π΄Π°Π½Π½ΡΡ Π±ΡΠ΄ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΈ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ².
β’ ΠΡΠ»ΠΈ ΠΊ ΡΡΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌ Π΄Π°Π½Π½ΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠ΅ ΠΏΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ° (Π° ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΎΠ·Π΄Π°Π½Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Π»Π°ΡΡΠΈ ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ), ΡΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ Π΄ΠΎΡΡΡΠΏΡ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊΠΈ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, Β«ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡΒ» ΠΊΠ°ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ².
Π ΠΊΠΎΠ΄Π΅ (ΡΡΠΎ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π½Π°Π³Π»ΡΠ΄Π½Π΅Π΅) ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ (ΠΊΠΎΠ΄ Ρ Π·Π°ΠΌΠ΅ΡΠ½ΡΠΌΠΈ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡΠΌΠΈ Π²Π·ΡΡ ΠΈΠ· ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°):
// ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ°
struct throwndata {
...
};
static pthread_once_t once = PTHREAD_ONCE_INIT;
static pthread_key_t key;
void createkey(void) { pthread_key_create(&key, NULL); }
// STL-ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π΄Π°Π½Π½ΡΡ
queue<throwndata*> result;
// ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°
void* GetBlock(void*) {
pthread_once(&once, createkey);
throwndata *td;
if ((td = (throwndata*)pthread_getspecific(key)) == NULL) {
td = new throwndata();
pthread_setspecific(key, (void*)td);
// Π²ΠΎΡ ΠΎΠ½ - Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΉ ΠΏΡΡΡ Π΄ΠΎΡΡΡΠΏΠ°:
result.push(td);
}
// Π΄Π°Π»Π΅Π΅ ΠΈΠ΄Π΅Ρ ΠΏΠ»ΠΎΠ΄ΠΎΡΠ²ΠΎΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Π½Π°Π΄ Π±Π»ΠΎΠΊΠΎΠΌ Π΄Π°Π½Π½ΡΡ *td
// . . . . . . . . .
}
int main(int argc, char **argv) {
// . . . . . .
for (int i = 0; i < N; i++)
pthread_create(NULL, NULL, GetBlock, NULL);
// . . . . . . ΠΊ ΡΡΠΎΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΈΡΡ;
// Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅Π»ΡΠ·Ρ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ result.size()
// Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΊΠ»Π°!
int n = result.size();
for (int i = 0; i < n; i++) {
throwndata *d = result.front();
// ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° *d ...
result pop();
delete d;
}
return EXIT_SUCCESS;
}
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΠΊΠΎΠ΄Π° ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΈ ΡΡΠ΅ΡΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ pthread_create() Π² Π²ΠΈΠ΄Π΅ &GetBlock (Π°Π΄ΡΠ΅ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°), Π½ΠΎ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠΎΠ·Π½Π°ΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Π»ΠΈ GetBlock. Π ΡΠΎ ΠΈ Π΄ΡΡΠ³ΠΎΠ΅ Π²Π΅ΡΠ½ΠΎ, ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΌΠ΅Π½, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π·ΡΡΡ Π΅Π΅ Π°Π΄ΡΠ΅Ρ.
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² β ΡΡΠΎ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΡΡΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΈΡΡ Π² ΡΠ΅Π±Π΅ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅, Π΅ΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ.
ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π² ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΡΠ΅Π΄Π΅
Π Π°ΡΡΠΌΠΎΡΡΠ΅Π² Β«Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈΒ» ΡΠ΅Ρ Π½ΠΈΠΊΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ Π³ΠΎΡΠΎΠ²Ρ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡ: Β«Π ΡΠ΅ΠΌ ΠΆΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΎΠΉ Π² ΠΎΠ±ΡΠ΅ΠΌ-ΡΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π³ΡΠΎΠΌΠΎΠ·Π΄ΠΊΠΎΠΉ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ? Π Π·Π°ΡΠ΅ΠΌ Π΄Π»Ρ Π΅Π΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠΈΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΡ POSIX?Β» Π‘Π°ΠΌΠΎΠ΅ ΠΏΡΡΠΌΠΎΠ΅ Π΅Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠΌΠΈΠΌΠΎ Π΄ΡΡΠ³ΠΈΡ Β«ΠΏΠΎΠΏΡΡΠ½ΡΡ Β» ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½Ρ ΡΠ°Π½Π΅Π΅, β ΡΡΠΎ ΠΎΠ±ΡΠΈΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΡΠ΅Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΡΡΠ½ΠΊΡΠΈΡ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ (thread safe) Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ. ΠΡΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π΅Π΄ΠΈΠ½ΡΡ (Π² ΡΠΌΡΡΠ»Π΅ Β«Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΡΒ», Π° Π½Π΅ Β«Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡΒ») ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠ‘ QNX, Π·Π°ΠΈΠΌΡΡΠ²ΡΡΡΠ°Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ GNU-ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ (gcc, make, β¦), ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ (ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² Π²ΠΈΠ΄Π° xxx.a), ΡΠ°ΠΊ ΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΈΠ»ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ (ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² Π²ΠΈΠ΄Π° xxx.so). Π¦Π΅Π»Π΅ΡΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΡ ΠΈ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠΈΡΡΠ΅ΠΌ (Π½Π° ΡΡΠΎ Π³Π»Π°Π²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈ Π½Π°ΡΠ΅Π»Π΅Π½Π° ΠΠ‘ QNX) Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΎΠΌΠ½ΠΈΡΠ΅Π»ΡΠ½Π°. ΠΠ΄Π½Π°ΠΊΠΎ Π²ΡΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ ΡΠ΅Π΅Π½ΡΠ΅ΡΠ°Π±Π΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠΌ ΠΌΠΎΠ΄ΡΠ»ΡΠΌ (ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ, ΡΠ°ΠΊ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ) Π² ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ ΡΠ΅ΡΠΌΠΈΠ½Π° Β«Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Β», Π½ΠΎ ΠΈ ΠΎΡ Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΊΡΠ΄Π° Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠΎΠΊΠΈΠΉ ΡΠΏΠ΅ΠΊΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈ Π² ΡΠΎΠΉ ΠΆΠ΅ ΠΌΠ΅ΡΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΊ Π»ΡΠ±ΡΠΌ Π½Π°Π±ΠΎΡΠ°ΠΌ ΡΡΠΈΠ»ΠΈΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (Π²ΠΈΠ΄Π° xxx.ΠΎ), ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΡΡ Π² Ρ ΠΎΠ΄Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΡΠ»ΠΈ ΠΌΡ ΠΎΠ±ΡΠ°ΡΠΈΠΌΡΡ ΠΊ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ API QNX (Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΠΊΠ°ΡΡΠΈΠ½Π° Π±ΡΠ΄Π΅Ρ ΠΈ Π² API Π»ΡΠ±ΠΎΠ³ΠΎ UNIX), ΡΠΎ Π·Π°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΡΠΌΠ΅ΡΠ΅Π½Π° ΠΊΠ°ΠΊ thread safe. Π Β«Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌΒ» ΠΎΡΠ½Π΅ΡΠ΅Π½Ρ ΡΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ, ΠΊΠ°ΠΊ select(), rand() ΠΈ readln(), Π° ΠΌΠ½ΠΎΠ³ΠΈΠΌ Β«Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌΒ» Π² ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΡΠ΅Π΄Π΅ Π²ΡΠ·ΠΎΠ²Π°ΠΌ ΡΠΎΠΏΡΡΡΡΠ²ΡΡΡ ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΡ Ρ ΡΡΡΡΠΈΠΊΡΠΎΠΌ *_r Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ MsgSend() β MsgSend_r().
Π ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠΎΡΡΠΎΠΈΡ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π² ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΡΠ΅Π΄Π΅? Π Π½Π΅ΡΠ΅Π΅Π½ΡΠ΅ΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅, Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡΡ Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ , Ρ ΡΠ°Π½ΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ rand(), ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌΡΡ Π² ΡΠ°ΠΌΡΡ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΡ ΠΠ‘ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ (ΠΏΡΠΈ Β«ΡΠ΄Π°ΡΠ½ΠΎΠΌΒ» Π²ΡΠ±ΠΎΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ Π, Π, Π‘):
int rand(void) {
static int x = rand_init();
return x = (A*x + B)%C;
}
Π’Π°ΠΊΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π°Ρ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ (ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ) ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ: Π°) Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ x ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅ΡΠ²Π°Π½ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ΠΌ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ, ΠΈ Π½Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΎ, ΡΡΠΎ Π²Π½ΠΎΠ²Ρ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΉ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡ ΠΊ rand() ΠΈ ΠΈΡΠΊΠ°Π·ΠΈΡ Ρ ΠΎΠ΄ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ; Π±) ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ Β«Ρ ΠΎΡΠ΅Π» Π±ΡΒ» ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΡ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ x, Π½Π΅ Π·Π°Π²ΠΈΡΡΡΡΡ ΠΎΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠ΅Π»Π°Π΅ΠΌΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡ, Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΠΉ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ x, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ Π΄Π²ΡΠΌΡ ΠΏΡΡΡΠΌΠΈ:
1. ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ:
int rand_r(int *x) {
return x = (Π * (*x) + Π) % Π‘;
};
ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Β«ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡΒ» ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ x Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ² (Π΄Π° ΠΈ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ Π΅Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ) Π½Π΅ ΡΠ½ΠΈΠΌΠ°Π΅ΡΡΡ, ΠΎΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡΡ Π½Π° ΠΏΠ»Π΅ΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΡΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΡΡΠ΅Ρ Π΅Π΅ ΡΡΠ΅ΠΊΠ° Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ :
void* thrfunc(void*) {
int x = rand_init();
... = rand_r(&x);
};
ΠΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠΎΠ²Π° ΡΠΎΡΠΌΠ° ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ° Π² API QNX β rand_r().
2. Π ΡΡΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΌΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ ΠΏΡΠΎΡΠΎΡΠΈΠΏ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π·Π° ΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ°. (ΠΠ΅ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ; Π²ΡΠ΅ ΠΈΠΌΠ΅Π½Π°, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ rand(), Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ ΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΈΠ· ΡΠΎΡΠΊΠΈ Π²ΡΠ·ΠΎΠ²Π°, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠ½ΡΡΠΎ ΡΠ²Π½ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° static.)
static pthread_key_t key;
static pthread_once_t once = PTHREAD_ONCE_INIT;
static void destr(void* db) { delete x; }
static void once_creator(void) { pthread_key_create(&key, destr); }
int rand(void) {
pthread_once(&once, once_creator);
int *x = pthread_getspecific(key);
if (x == NULL) {
pthread_setspecific(key, x = new int);
*x = rand_init();
}
return x = (A * (*x) + B) % C;
}
Π ΡΡΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ, Π²Π΅ΡΡ ΠΊΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ΅ΠΊΡΡΡΠ°Π»ΡΠ½ΠΎ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌ:
void* thrfunc(void*) {
// ...
while (true) {
... = rand(x);
}
}
ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΡΠ΅Π΄Ρ ΡΠΎΡΡΠΎΠΈΡ Π² Π·Π°ΠΌΠ΅Π½Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΡ (ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ), ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ rand(), ΠΈ Π½ΠΎΠ²ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ΠΉ.
ΠΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΡΠΏΠΎΡΠΎΠ±Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ ΠΏΠΎΠ΄ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ API, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ 25 Π»Π΅Ρ Π½Π°Π·Π°Π΄β¦ (ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΠ°ΠΊ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡ POSIX, Π²Π²ΠΎΠ΄ΡΡΠΈΠΉ Π² ΠΎΠ±ΠΈΡ ΠΎΠ΄ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²).
ΠΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ, ΡΡΠ°ΡΡΠ²ΡΡΡΠ΅ΠΌΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π² ΡΠ°ΠΉΠ»Π΅ <sys/target_nto.h>, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π²ΡΠ΅ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π»Ρ ΠΠ‘ QNX ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ: