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

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

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

Π—Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

Π—Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ трСмя Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ функциями, Π² основС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π»Π΅ΠΆΠΈΡ‚ функция ΠΈΠ· native QNX API SyncMutexLock().

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Π·Π°Ρ…Π²Π°Ρ‚

int pthread_mutex_lock(pthread_mutex_t* mutex);

Ѐункция Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся mutex. Если ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся Π΄ΠΎ освобоТдСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈ послС этого Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ. Волько послС этого функция pthread_mutex_lock() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. Если Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ пытаСтся ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌ ΡƒΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚, Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_mutex_lock() Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ Π΅Π³ΠΎ создании. QNX прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ рСкурсивного Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΏΡ€ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… настройках Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (см. Π²Ρ‹ΡˆΠ΅ Ρ€Π°Π·Π΄Π΅Π» Β«ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°Β»). ΠŸΡ€ΠΈ создании ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚. Если Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ контроля ошибок ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ рСкурсивный Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, функция pthread_mutex_lock() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ EDEADLK ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

Ѐункция pthread_mutex_lock() ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния: EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅;

EAGAIN β€” нСдостаточно систСмных рСсурсов для Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°;

EDEADLK β€” Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ рСкурсивный Π·Π°Ρ…Π²Π°Ρ‚ (Ρ€Π΅ΠΆΠΈΠΌ контроля ошибок);

EINVAL β€” Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° mutex.

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Ρ…Π²Π°Ρ‚Π°

int pthread_mutex_trylock(pthread_mutex_t* mutex);

Ѐункция провСряСт, свободСн Π»ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ mutex, ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ ΠΎΠ½Π° Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EBUSY.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅;

EAGAIN β€” нСдостаточно систСмных рСсурсов для Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°;

EBUSY β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ mutex ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½;

EINVAL β€” Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° mutex.

Π—Π°Ρ…Π²Π°Ρ‚ с установкой Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ оТидания

#include <pthread.h>

#include <time.h>

int pthread_mutex_timedlock(pthread_mutex_t* mutex,

 const struct timespec* abs_timeout);

Ѐункция провСряСт, свободСн Π»ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ (mutex), ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹Π·Π²Π°Π½Π° функция, Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ этот ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. Если ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся Π΄ΠΎ освобоТдСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π»ΠΈΠ±ΠΎ Π΄ΠΎ наступлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ abs_timeout. Если это врСмя ΡƒΠΆΠ΅ наступило, ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ блокируСтся Π²ΠΎΠΎΠ±Ρ‰Π΅, Π½ΠΎ Π·Π°Ρ…Π²Π°Ρ‚ всС-Ρ‚Π°ΠΊΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ свободСн.

НаступлСниС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ опрСдСляСтся ΠΏΠΎ часам REALTIME_CLOCK, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ часов оказываСтся Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ большим значСния, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² abs_timeout. Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… timespec ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅ <time.h>.

Если ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ создан с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° PRIO_INHERIT, Ρ‚ΠΎ послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ΅ ΠΏΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρƒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° подвСргаСтся пСрСсмотру Π² соотвСтствии с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅;

EAGAIN β€” нСдостаточно систСмных рСсурсов для Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°;

EDEADLK β€” Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ рСкурсивный Π·Π°Ρ…Π²Π°Ρ‚ (Ρ€Π΅ΠΆΠΈΠΌ контроля ошибок);

EINVAL β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° для прСдотвращСния инвСрсии (Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ protocol установлСн Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_PRIO_PROTECT), Π½ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹ΡˆΠ΅ Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, присвоСнного ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡƒ; ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ (ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π΅ свободСн), Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля abs_timeout, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ количСство наносСкунд, мСньшС нуля ΠΈΠ»ΠΈ большС 1000 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ²; пСрСмСнная, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ mutex, Π½Π΅ являСтся ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ.

ETIMEDOUT β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ истСк.

ОсвобоТдСниС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

int pthread_mutex_unlock(pthread_mutex_t* mutex);

Ѐункция pthread_mutex_unlock() освобоТдаСт ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся пСрСмСнная mutex. Π’Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Если Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ освобоТдСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ (ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π²Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°Ρ… дольшС всСх Тдавший) Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ состояния ΠΈ становится Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

Для ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ², Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΡ… рСкурсивный Π·Π°Ρ…Π²Π°Ρ‚, функция освобоТдСния Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Ρ€Π°Π·, сколько ΠΈ функция Π·Π°Ρ…Π²Π°Ρ‚Π°.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅;

EINVAL β€” пСрСмСнная, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ mutex, Π½Π΅ являСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ;

EPERM β€” Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ являСтся Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

Π Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ

int pthread_mutex_destroy(pthread_mutex_t* mutex);

Π’Ρ‹Π·ΠΎΠ² Ρ€Π°Π·Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ пСрСмСнная mutex. ПослС Ρ‡Π΅Π³ΠΎ эта пСрСмСнная Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована Π±Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° pthread_mutex_init().

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния:

EOK β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅;

EBUSY - ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ Π΄ΠΎ освобоТдСния;

EINVAL β€” пСрСмСнная, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ mutex, Π½Π΅ являСтся ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ - ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ POSIX

Π’ native QNX API Π΅ΡΡ‚ΡŒ ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ POSIX-стандартом, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ вСсьма ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏ POSIX-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° пороТдаСтся ΠΎΡ‚ sync_t, Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… POSIX, ΠΈ Β«Ρ€ΠΎΠ΄Π½Ρ‹Ρ…Β» native-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ QNX. Однако Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π½ΠΈ ΠΎ ΠΊΠ°ΠΊΠΎΠΉ мСТсистСмной совмСстимости Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ Π½Π΅ приходится.

ВосстановлСниС Β«ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ³ΠΎΒ» ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

#include <sys/neutrino.h>

int SyncMutexRevive(sync_t* sync);

int SyncMutexRevive_r(sync_t* sync);

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ[36] ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для восстановлСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² состоянии блокирования DEAD. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² состояниС DEAD, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, использованная ΠΏΡ€ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, освобоТдаСтся. Π’Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° ΡƒΠΌΠΈΡ€Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ, Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, располоТСнный Π² раздСляСмой памяти. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ становится Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, ΠΈ Π΅Π³ΠΎ счСтчик Π·Π°Ρ…Π²Π°Ρ‚ΠΎΠ² устанавливаСтся Π² 1 для рСкурсивного ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

Ошибки выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π•FAULT β€” ошибка ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ;

EINVAL β€” ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации Π½Π΅ сущСствуСт ΠΈΠ»ΠΈ Π½Π΅ находится Π² состоянии DEAD;

ETIMEDOUT β€” ΠΎΡ‚ΠΌΠ΅Π½Π° Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρƒ ядра (устанавливаСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ TimerTimeout()).

Установка увСдомлСния ΠΎ «смСрти» ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ состояниС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΊΠ°ΠΊ DEAD ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SyncMutexEvent(), которая опрСдСляСт событиС, связанноС со Β«ΡΠΌΠ΅Ρ€Ρ‚ΡŒΡŽΒ» ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°.

#include <sys/neutrino.h>

int SyncMutexEvent(sync_t* sync, struct sigevent* event);

int SyncMutexEvent_r(sync_t* sync, struct sigevent* event);

Данная функция ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для установки ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ситуации, ΠΊΠΎΠ³Π΄Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² состояниС DEAD (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ пСрСраспрСдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°). Π—Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, оказавшийся Π² состоянии DEAD, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π»Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SyncMutexRevive().

Ошибки выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

EAGAIN β€” Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ядро Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ рСсурсов для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса;

EFAULT β€” ошибка ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ обращСния ΠΊ sync;

EINVAL β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ sync, Π½Π΅ сущСствуСт.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ примСнСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

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

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

template <class T> class CDataQueue {

public:

 CDataQueue() { pthread_mutex_init(&_mutex, NULL); }

 ~CDataQueue() { pthread_mutex_destroy(&_mutex); }

 void push(T _new_data) {

  pthread_mutex_lock(&_mutex);

  data_queue.push(_new_data);

  data_event.reset();

  pthread_mutex_unlock(&_mutex);

 }

 T pop() {

  data_event.wait();