Π ΡΠ°ΠΊΠΎΠΉ ΡΡ Π΅ΠΌΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡΡ Π² ΡΠΎΡΠΊΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ (ΠΈ Π·Π°ΡΠ°ΡΡΡΡ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ) ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Π ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΌ ΡΠ°Π±Π»ΠΎΠ½Π΅ ΠΌΡ Π½Π΅ ΡΡΠ°Π»ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π²ΠΎΠ·Π²ΡΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°Π³ΡΠΎΠΌΠΎΠΆΠ΄Π°ΡΡ ΠΊΠΎΠ΄. ΠΠΎΠ·Π²ΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΡΡ ΡΠ°Π½Π΅Π΅, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡ ΡΠ»Π° ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ ΡΡ Π΅ΠΌΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΊΠΎΠ²ΡΡ , Π½ΠΎ ΠΎΠ½Π° Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π½Π°Ρ Π½Π° Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΏ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² β Π±Π°ΡΡΠ΅Ρ.
ΠΠ°ΡΡΠ΅Ρ
ΠΠ°ΡΡΠ΅Ρ ΠΊΠ°ΠΊ ΡΠ°Π· ΠΈ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΡΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ β ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΡ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π·Π°Π΄Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΡΠΎΡΠΊΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠΎΡΡΠΈΠ³Π½ΡΠ² ΡΡΠΎΠΉ ΡΠΎΡΠΊΠΈ, ΠΏΠΎΡΠΎΠΊΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡΡΡ Β«ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΒ» ΠΈ ΡΠΆΠ΅ Ρ ΡΡΠΎΠΉ ΡΠΎΡΠΊΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ²ΠΎΠ΅ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅. Β«ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠ°ΡΒ» ΡΡ Π΅ΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±Π°ΡΡΠ΅ΡΠ° (ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΠ°ΠΊΠΎΠΌ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ½ ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ), Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌΠ°Ρ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΡ , Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ (ΠΌΡ ΡΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π΅Π΅ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΠΊΠΎΠ΄Π°):
static pthread_barrier_t bfinish;
void* threadfunc(void* data) {
// ΠΏΠΎΡΠΎΠΊΠΈ ΡΡΠΎ-ΡΠΎ Π΄Π΅Π»Π°ΡΡ ...
pthread_barrier_wait(&bfinish);
return NULL;
}
int main(int argc, char *argv[]) {
int N = ...; // Π±ΡΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ N ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²
if (pthread_barrier_init(&bfinish, NULL, N + 1) != EOK)
perror("barrier init"), exit(EXIT.FAILURE);
for (int i = 0; i < N; i++)
if (pthread_create(NULL, NULL, threadfunc, NULL) != EOK)
perror("thread create"), exit(EXIT_FAILURE);
pthread_barrier_wait(&bfinish);
}
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΏΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΠ° ΡΡ Π΅ΠΌΠ° ΠΌΠ°Π»ΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π½Π° pthread_join(), ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠΈΡ Π² ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ: Π΅ΡΠ»ΠΈ ΡΠ°Π½Π΅Π΅ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ Π΅ΠΌΠ΅ ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΈΠΌΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠΊΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡ Π΅ΠΌΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π½Π° pthread_join() ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠ° ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Β«ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ Β» ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΡ Π΅ΠΌΠ° Π½Π° pthread_barrier_wait() ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΈ ΠΊ Β«ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΌΒ», Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ.
ΠΠΎ Π΅ΡΠ»ΠΈ Π±Ρ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ Π΄Π²ΡΡ ΡΡ Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΠΎΠΌ ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π»ΠΎΡΡ, ΡΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ΡΠ΅Π»Π΅ΡΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π²Π²ΠΎΠ΄ΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π±Π°ΡΡΠ΅ΡΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ΅Ρ Π½ΠΈΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±Π°ΡΡΠ΅ΡΠΎΠ² ΡΠΈΡΠ΅, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ, Π½Π°ΠΏΡΠΎΡΠΈΠ², ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ (Π² ΡΠΈΠΊΠ»Π΅ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°) ΡΡΠ°ΡΡΠΎΠ²Π°Π»ΠΈ Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Β«ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΒ» (ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΡΠΎ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Ρ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΈΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ, ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΠΈΠΉ):
static pthread_barrier_t bstart;
void* threadfunc(void* data) {
// Π²ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ "Π·Π°ΡΡΡΡΡΡ" Π½Π° Π²Ρ ΠΎΠ΄Π½ΠΎΠΌ Π±Π°ΡΡΠ΅ΡΠ΅,
// ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΌ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ "ΡΠΎΡΠ²Π°ΡΡΡΡ" Π² ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅...
pthread_barrier_wait(&bstart);
// ... Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ...
return NULL;
}
int main(int argc, char *argv[]) {
...
int N = ...; // Π±ΡΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ N ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²
if (pthread_barrier_init(&bstart, NULL, N) != EOK)
perror("barrier init"), exit(EXIT_FAILURE);
for (int i = 0; i < nthr; i++) {
if (pthread_create(NULL, NULL, threadfunc, NULL) != EOK)
perror("thread create"), exit(EXIT_FAILURE);
}
...
}
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ Π½Π° Π±Π°ΡΡΠ΅ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΡΠΈ Π΅Π³ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ: Π·Π΄Π΅ΡΡ ΠΎΠ½ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ ΠΌΠ΅Π½ΡΡΠ΅.
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±Π°ΡΡΠ΅ΡΠΎΠ² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΠ΅ [1], ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π° ΡΡΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΡΠΎ ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΡ Π² ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
ΠΠΎ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ QNX [8] ΠΏΡΠΈΡΠΈΡΠ»ΡΠ΅Ρ Π±Π°ΡΡΠ΅ΡΡ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΄ΡΠ°, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΡΡΠ΅Π΄ΡΡΠ² native API QNX, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π°ΡΡΠ΅ΡΠ°ΠΌΠΈ, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π΅ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ, Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» <pthread.h> ΡΠ°ΠΊ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΈΠΏ pthread_barrier_t:
typedef struct {
unsigned int barrier;
unsigned int count;
pthread_mutex_t lock;
pthread_cond_t bcond;
} pthread_barrier_t;
ΠΡΠ²ΠΎΠ΄Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ.
Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π³Π°Π΄ΠΎΡΠ½ΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ QNX 6.2.1 Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π°ΡΡΠ΅ΡΠΎΠΌ ΠΈ Π΅Π³ΠΎ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ ΠΎΠΏΠΈΡΠ°Π½Ρ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ <pthread.h>, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ pthread_barrier_wait() ΠΈ pthread_barrierattr_setpshared(), ΠΎ ΠΊΠΎΡΠΎΡΡΡ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΎΠΏΠΈΡΠ°Π½Ρ Π² ΡΠ°ΠΉΠ»Π΅ <sync.h>! ΠΠΎ Π΅ΡΠ»ΠΈ Π·Π°Π³Π»ΡΠ½ΡΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΠΎ Π²ΡΡΡΠ½ΡΠ΅ΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π°ΡΡΠ΅ΡΠΎΠΌ Π»ΠΈΠ±ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» <pthread.h>, Π»ΠΈΠ±ΠΎ <sync.h>.
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Π±Π°ΡΡΠ΅ΡΠ°ΠΌΠΈ
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π±Π°ΡΡΠ΅ΡΠ°
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡ ΠΈ ΡΠ°Π·ΡΡΡΠ°ΡΡ Π±Π»ΠΎΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π±Π°ΡΡΠ΅ΡΠ°:
int pthread_barrierattr_init(pthread_barrierattr_t* attr);
int pthread_barrierattr_destroy(pthread_barrierattr_t* attr);
Π€ΡΠ½ΠΊΡΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
EOK β ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;
ENOMEM β Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π±Π°ΡΡΠ΅ΡΠ°.
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
EOK β ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;
EINVAL β ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π½Π΅Π²Π΅ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π±Π°ΡΡΠ΅ΡΠ° attr.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π±Π°ΡΡΠ΅ΡΠ° ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΡΠΈΠΏΠΎΠΌ pthread_barrierattr_t ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΈΠΏΠ°ΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ Π±Π°ΡΡΠ΅ΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π±Π°ΡΡΠ΅ΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²:
int pthread_barrierattr_setpshared(
pthread_barrierattr_t* attr, int pshared);
int pthread_barrierattr_getpshared(
const pthread_barrierattr_t* attr, int* pshared);
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΡ Π±Π°ΡΡΠ΅ΡΠ° Π·Π°ΠΏΡΠ΅ΡΠ°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ².
ΠΠ±Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
EOK β ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;
EINVAL β ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ ΠΎΠ±Π° ΠΈΠ· ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π½Π΅Π²Π΅ΡΠ½Ρ.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΠ΅ Π±Π°ΡΡΠ΅ΡΠ°
int pthread_barrier_init(pthread_barrier_t* barrier,
const pthread_barrierattr_t* attr, unsigned int count);
Π€ΡΠ½ΠΊΡΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΠΏΠ° Π±Π°ΡΡΠ΅Ρ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. Π Π°ΡΡΠΈΠ±ΡΡΠ°Ρ Π±Π°ΡΡΠ΅ΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ (ΠΈΠ»ΠΈ Π·Π°ΠΏΡΠ΅ΡΠ°Π΅ΡΡΡ) Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π±Π°ΡΡΠ΅ΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ°ΠΊΠΎΠΉ Π΄ΠΎΡΡΡΠΏ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌΡ ΡΠ°Π½Π΅Π΅ Π±Π°ΡΡΠ΅ΡΡ, Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°Π·ΡΡΡΠΈΡΡ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π°ΡΡΠΈΠ±ΡΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π±Π°ΡΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ count ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π±ΡΠ΄Π΅Ρ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π½Π° Π±Π°ΡΡΠ΅ΡΠ΅ Π΄ΠΎ ΠΈΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
EOK β ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;
EAGAIN β ΡΠΈΡΡΠ΅ΠΌΠ΅ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΡΠ΅ΡΡΡΡΠΎΠ² Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±Π°ΡΡΠ΅ΡΠ°;
EBUSY β ΠΏΠΎΠΏΡΡΠΊΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΆΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±Π°ΡΡΠ΅ΡΠ°;
EFAULT β ΡΠ±ΠΎΠΉ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π» ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΡΠ΄ΡΠ° ΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌ;
EINVAL β attr ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠΎΠ².
int pthread_barrier_destroy(pthread_barrier_t* barrier);
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ°Π·ΡΡΡΠ°Π΅Ρ Π±Π°ΡΡΠ΅Ρ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ barrier Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π±Π΅Π· ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ Π΅Π³ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
EOK β ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;
EBUSY β Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π½Π° Π±Π°ΡΡΠ΅ΡΠ΅;
EINVAL β Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ barrier.
ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π½Π° Π±Π°ΡΡΠ΅ΡΠ΅
Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ (ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ) Π½Π° Π±Π°ΡΡΠ΅ΡΠ΅:
int pthread_barrier_wait(pthread_barrier_t* barrier);
ΠΡΠ·ΠΎΠ² ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π° Π±Π°ΡΡΠ΅ΡΠ΅ Π½Π΅ Π½Π°ΠΊΠΎΠΏΠΈΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΡΠ°Π½Π΅Π΅ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_barrier_init().
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Ρ ΠΎΡΠΎΠ±ΠΎΠΉ ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΡΡΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±Π°ΡΡΠ΅ΡΠΎΠ² Π΄Π»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠ°Π·Π½ΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ². ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠ΅ Ρ Π±Π°ΡΡΠ΅ΡΠ°, Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅ Π½Π° ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ), ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΡΡΡΠ΅ΠΊΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ΠΈΠ½Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ².
ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° Π±Π°ΡΡΠ΅ΡΠ΅, ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΈΠ³Π½Π°Π», Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, Π½ΠΎ ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊ Π²Π½ΠΎΠ²Ρ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΡ Π±Π°ΡΡΠ΅ΡΠ°.
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ QNX ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ Π½Π΅Π»ΡΠ·Ρ Π·Π°ΡΠ°Π½Π΅Π΅ ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ ΠΏΠ΅ΡΠ²ΡΠΌ, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π΄ΠΎΡΡΠΈΠ³Π½Π΅Ρ Π±Π°ΡΡΠ΅ΡΠ°. Π£ΡΠΈΡΡΠ²Π°Ρ, ΡΡΠΎ ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π°ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ° Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ (ΠΊΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, ΡΠΈΠΏΠ° pthread_barrier_t), ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°ΠΌ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π½Π° ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΡ Β«ΡΠΈΡΠΎΠΊΠΎΠ²Π΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅Β» (broadcast), ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅. ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ QNX ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΡΠ²ΡΠΌ Π±ΡΠ΄Π΅Ρ Β«ΠΎΡΠΏΡΡΠ΅Π½Β» ΡΠΎΡ ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΆΠ΄Π°Π» Π΄ΠΎΠ»ΡΡΠ΅ Π΄ΡΡΠ³ΠΈΡ .