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

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

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

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ссли Π±Ρ‹ ΠΏΡ€ΠΈ поступлСнии Π½ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ графичСской систСмы ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ автоматичСски (нСявно) разблокировался ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ приступал ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π° Π² ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Ρ‹ отсутствия Ρ‚Π°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… - простаивал Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ состоянии. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠΉ схСмы ΠΌΡ‹ построили ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСмафор для увСдомлСния ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ указанная Π·Π°Π΄Π°Ρ‡Π° сводится ΠΊ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π²ΡˆΠ΅ΠΌΡƒΡΡ Ρ€Π°Π½Π΅Π΅ классу Π·Π°Π΄Π°Ρ‡ ΠΎ синхронизации производитСля ΠΈ потрСбитСля Π΄Π°Π½Π½Ρ‹Ρ….

class event {

Β /* класс ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ события, Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ

Β Β Β  ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Π² Π±ΡƒΡ„Π΅Ρ€ */

public:

Β event() { sem_init(&_block, 0, 0); }

Β ~event() { sem_destroy(&_block); }

Β void wait() { sem_wait(&_block); }

Β void reset() { sem_post(&_block); }

private:

Β sem_t _block;

};

/* ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ класс ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… */

template <class T> class CDataQueue {

public:

Β CDataQueue() {}

Β ~CDataQueue() {}

Β void push(T _new_data) {

Β  _data_queue.push(_new_data);

Β  data_event.reset();

Β }

Β T pop() {

Β  data_event.wait();

Β  T res = _data_queue.front();

Β  _data_queue.pop();

Β  return res;

Β }

private:

Β std::queue<T> _data_queue;

Β event data_event;

};

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹

CDataQueue
Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для хранСния вновь ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ практичСски нСзависимыми ΠΏΠΎΡ‚ΠΎΠΊΠΈ производитСля ΠΈ потрСбитСля. НСзависимыми Π²ΠΎ всСх случаях, ΠΊΡ€ΠΎΠΌΠ΅ пустой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ производитСля. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ внСсСт Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΏΠΎΡ‚ΠΎΠΊ потрСбитСля разблокируСтся ΠΈ считаСт эти Π΄Π°Π½Π½Ρ‹Π΅. Π’ΠΎΠ½ΠΊΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ потрСбитСля блокируСтся сам ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
pop()
, Π° разблокируСтся ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° производитСля ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
push()
.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² построСнии спСцифичСских срСдств синхронизации Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного, Π²ΠΎΠΏΡ€Π΅ΠΊΠΈ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰Π΅ΠΌΡƒΡΡ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎ созданиС срСдств синхронизации со спСцифичСским ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½ΠΎ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎ, Π° ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΊΠΎΠ΄ позволяСт Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ возмоТности Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сСмафора ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ «бСзопасным» использованиСм описанной схСмы Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² β€” ΠΎΠ΄Π½ΠΎΠ³ΠΎ производитСля ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ потрСбитСля. Если нСсколько (Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ…) ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

pop()
ΠΈΠ»ΠΈ
push()
, начнСтся ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π°, ΠΈ Ρ‡Π΅ΠΌ это закончится, ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. По своСй Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΊΠΎΠ΄ ΠΎΠ±Π΅ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ систСмС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ эксклюзивного исполнСния. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ этим участкам ΠΊΠΎΠ΄Π°, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСмафор, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ срСдство синхронизации, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, - ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

ΠœΡŒΡŽΡ‚Π΅ΠΊΡ

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

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (Π·Π°Ρ…Π²Π°Ρ‚Π°)

pthread_mutex_lock()
провСряСтся, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ Π»ΠΈ ΡƒΠΆΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся Π΄ΠΎ освобоТдСния критичСской сСкции. Если ΠΆΠ΅ Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΅Π³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°) ΠΈ устанавливаСт ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½.

Когда дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСльзя ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ совмСстно, Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Ρ‹, ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (освобоТдСния)

pthread_mutex_unlock()
, которая провСряСт, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ Π΅Π΅ ΠΏΠΎΡ‚ΠΎΠΊ являСтся Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ ΠΎΠ½Π° Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, послС Ρ‡Π΅Π³ΠΎ ОБ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Если Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ освобоТдСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, пСрСводится ΠΈΠ· состояния блокирования Π² состояниС готовности ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π’ QNX Neutrino 6.2.1 ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈΠΌΠ΅Π΅Ρ‚ наибольшиС возмоТности ΠΏΠΎ Ρ‚ΠΎΠ½ΠΊΠΎΠΉ настройкС своих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² срСди всСх ΠΈΠ½Ρ‹Ρ… элСмСнтов синхронизации. Π’ связи с этим ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΎΡ‡Π΅Π½ΡŒ сильно зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ значСния Π²Ρ‹ присвоитС Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΎΡ‚ сСмафора Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄ критичСской сСкции. ΠžΡ‚ΡΡŽΠ΄Π° ΠΈ ваТнСйшиС свойства ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ нСльзя Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Если ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Π³ΠΎ Β«ΠΎΡ‚ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΒ». Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ (tid ΠΏΠΎΡ‚ΠΎΠΊΠ°), систСма ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ врСмя ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ инвСрсии ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². НаконСц, зная ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ, ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, пытаСтся Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ (ΠΎΠ΄Π½Π° ΠΈΠ· разновидностСй deadlock β€” ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ сущСствуСт Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, способного ΠΎΡ‚ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ освобоТдСния этого ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°).

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

ВсС объявлСния ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² находятся Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅

<pthread.h>
, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ:

#include <pthread.h>

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° хранятся Π² структурС

pthread_mutexattr_t
, которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Ρ‚ΠΈΠΏΠΎΠΌ
sync_attr_t
. Π­Ρ‚Π° структура Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ, создана ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π΄ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, послС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΈ использована для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.