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

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

Автор Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ ОлСг Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡

signo
β€” Π½ΠΎΠΌΠ΅Ρ€ сигнала (с Π½ΠΈΠΌ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ Π²Ρ‹ΡˆΠ΅).

code
ΠΈ
value
β€” ΠΊΠΎΠ΄ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ассоциированныС с сигналом (ΠΈΡ… ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ встрСчали ΠΏΡ€ΠΈ рассмотрСнии ΠΌΠΎΠ΄Π΅Π»ΠΈ сигналов Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ).

Как ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, внСшнСС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ (для программиста) основной Ρ„ΠΎΡ€ΠΌΡ‹

SignalKill()
ΠΈ Ρ„ΠΎΡ€ΠΌΡ‹, бСзопасной Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС,
SignalKill_r()
состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ:

β€’Β 

SignalKill()
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1 Π² случаС ошибки, Π° ΠΊΠΎΠ΄ ошибки заносится Π²
errno
; любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ являСтся ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния;

β€’Β 

SignalKill_r()
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
EOK
Π² случаС успСха, Π° Π² случаС ошибки возвращаСтся ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ошибки (Ρ‚ΠΎΡ‚ ΠΆΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ основная Ρ„ΠΎΡ€ΠΌΠ° заносит Π²
errno
, Π½ΠΎ со Π·Π½Π°ΠΊΠΎΠΌ минус).

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄Ρ‹ ошибок, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ этими Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ:

EINVAL
β€” нСдопустимоС числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
signo
;

ESRCH
β€” Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ адрСсат (
pid
ΠΈΠ»ΠΈ
tid
);

EPERM
β€” процСсс Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ достаточных ΠΏΡ€Π°Π² для посылки сигнала;

EAGAIN
β€” нСдостаточно рСсурсов ядра для выполнСния запроса.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования этой возмоТности, Π²ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ любой ΠΈΠ· ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ²ΡˆΠΈΡ…ΡΡ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², разнСситС процСссы ΠΏΠΎ сСтСвым ΡƒΠ·Π»Π°ΠΌ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Β«Ρ†Π΅Π»Π΅ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅Β» Π² процСссС-ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅.

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΈ дСмонстрациСй ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π² сСти ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий:

β€’Β ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ запуск Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡƒΠ·Π»Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

# on -f <host> raqc

β€’Β ΠŸΠΎΡΠ»Π΅ Ρ‡Π΅Π³ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ряд ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ [Ctrl+C] с локального Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π»Π΅ΠΊΠΎ ΠΈΠ΄ΡƒΡ‰ΠΈΠ΅ послСдствия этого «малСнького» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ стандартной POSIX-схСмы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сигналами:

‒ На Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ΅ «сСтСвых сигналов» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ построСна цСлая систСма ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ сСтСвых ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ систСмы.

β€’Β Π˜ΠΌΠ΅Π½Π½ΠΎ Β«ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉΒ» (Π½ΠΎ Π½Π΅ синхронизации с наслСдованиСм ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², Π²Π»ΠΈΡΡŽΡ‰Π΅ΠΉ Π½Π° ΠΎΠ±Ρ‰ΡƒΡŽ систСму диспСтчСризации ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… частСй ΠΈ Ρ‚.ΠΏ.): посылка сигнала являСтся Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ (Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π°), Π° ΠΏΡ€ΠΈΠ΅ΠΌ сигнала Π½Π΅ сопровоТдаСтся наслСдованиСм (ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ) ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ².

β€’Β Π’Π°ΠΊΠΎΠ΅ «сигнальноС» взаимодСйствиС, записанноС Π² Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ POSIX-сСмантикС (Π½ΠΎ, ΠΏΠΎ сути, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰Π΅Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹, Π΄Π°Π»Π΅ΠΊΠΎ выходящиС Π·Π° POSIX), ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π² записи ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ использовании Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями (ΠΏΡƒΠ»ΡŒΡΠ°ΠΌΠΈ).

4. ΠŸΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ синхронизации

ОБ QNX Neutrino прСдоставляСт ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ€ элСмСнтов синхронизации выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠ°ΠΊ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса, Ρ‚Π°ΠΊ ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ практичСски ΠΏΠΎΠ»Π½Ρ‹ΠΉ спСктр ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ², описываСмых ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ стандартом POSIX, Ρ‚Π°ΠΊ ΠΈ всСми Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со всСми этими ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌΠΈ Π½Π΅ ΠΏΠΎΠΊΠΈΠ΄Π°Π΅Ρ‚ ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ€Π³Π°Π½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ для самой ОБ (ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, условная пСрСмСнная), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅Β β€” достаточно громоздкая надстройка Π½Π°Π΄ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ, рСализуСмая, Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² ΡƒΠ³ΠΎΠ΄Ρƒ POSIX.

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

К соТалСнию, ΠΈ тСхничСская докумСнтация QNX [8], ΠΈ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΊΠ½ΠΈΠ³Π° Π . ΠšΠ΅Ρ€Ρ‚Π΅Π½Π° [1] написаны ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ схСмС: [35]всС, Ρ‡Ρ‚ΠΎ касаСтся ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² синхронизации, Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠΌΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ POSIX (Π±Π°Ρ€ΡŒΠ΅Ρ€Ρ‹, ТСсткая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° (sleepon), спинлок, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния-записи), описываСтся Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΈ сопровоТдаСтся ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ΄Π°, Π° Π²ΠΎΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ понятия, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ

pthread_mutex_t
,
sem_t
(Π΄Π° ΠΈ
pthread_cond_t
, ΠΏΠΎ сущСству), описаны лишь качСствСнно, Β«Π½Π° ΠΏΠ°Π»ΡŒΡ†Π°Ρ…Β», Π² ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… рассказах ΠΎΠ± Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ пользования Π²Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ½Π°Ρ‚ΠΎΠΉ ΠΈ ΠΊΡƒΡ…Π½Π΅ΠΉ (Ρ‚Π΅Ρ€ΠΌΠΈΠ½ bathroom встрСчаСтся Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π°Ρ‰Π΅, Ρ‡Π΅ΠΌ
pthread_mutex_t
). ΠœΡ‹ попытаСмся ΠΏΠΎ возмоТности ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот пСрСкос.

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

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ срСдств синхронизации, прСдоставляСмоС Π² POSIX API QNX, строится ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ этих ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… срСдств синхронизации. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π°Π½Π°Π»ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² систСмы ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ срСдства синхронизации, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π² POSIX API, строятся с использованиСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π° мыотСкс-условная пСрСмСнная с ΠΎΠ΄Π½ΠΎΠΉ стороны ΠΈ сСмафор с Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСзависимыми базисами, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… позволяСт ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ практичСски любой, сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ спСцифичСский элСмСнт синхронизации, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉ потрСбностям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈ построСнии вашСй систСмы. ΠœΡ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ эту ΠΌΡ‹ΡΠ»ΡŒ ΠΏΠΎΠ·ΠΆΠ΅, ΠΏΡ€ΠΈ рассмотрСнии особСнностСй примСнСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ².

НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ€ элСмСнтов синхронизации окаТСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ для Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Π²Π°ΠΌΠΈ систСмы, Π²Π°ΠΆΠ½Ρ‹ΠΌ являСтся Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π² случаС, Ссли ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ систСмой срСдства синхронизации ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ вас Π½Π΅ ΡƒΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚, Ρ‚ΠΎ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ собствСнныС срСдства синхронизации, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ базис ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ. И ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ срСдства синхронизации Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ вас.

ΠœΡ‹ постараСмся ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту идСю ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ использования Π±Π°Π·ΠΎΠ²Ρ‹Ρ… срСдств синхронизации Π² качСствС «конструктора» ΠΏΡ€ΠΈ построСнии Π±ΠΎΠ»Π΅Π΅ слоТных. Π’Ρ€ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… элСмСнта синхронизации ОБ QNX β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, условная пСрСмСнная ΠΈ сСмафор β€” Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ микроядра систСмы ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

SyncTypeCreate(unsigned type, sync_t* sync, const struct _sync_attr_t* attr);

Π—Π΄Π΅ΡΡŒ

type
ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния:

_NTO_SYNC_MUTEX_FREE
β€” для создания ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°;

_NTO_SYNC_SEM
β€” для создания сСмафора;

_NTO_SYNC_COND
β€” для создания условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΊΡ‚Π°. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚ΠΈΠΏΡ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° (

pthread_mutex_t
), условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (
pthread_cond_t
) ΠΈ сСмафора (
sem_t
) ΡΠ²Π»ΡΡŽΡ‚ΡΡ псСвдонимами Ρ‚ΠΈΠΏΠ°
sync_t
. А Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ‚ΠΈΠΏΡ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ псСвдонимами ΠΎΠ΄Π½ΠΎΠ³ΠΎ-СдинствСнного Ρ‚ΠΈΠΏΠ° β€”
sync_attr_t
, содСрТащСго ΠΏΠΎΠ»Π΅
protocol
, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ опрСдСляСт, ΠΊΠ°ΠΊΠΈΠΌ способом ОБ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΈΡ… инвСрсии.