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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 45

Автор Уильям БтивСнс

int pthread_cond_destroy(pthread_cond_t *cptr);

/* ВсС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π•Ρ…Ρ…Ρ… – Π² случаС ошибки */

Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. АргумСнт mptr Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° pthread_mutex_t, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΡƒΠΆΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈ Ρ‚ΠΎΠ³Π΄Π° функция pthread_mutex_init ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ это Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° pthread_mutexattr_t, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_mutex_init(attr ), Π·Π°Π΄Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ этого ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Если этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ прСдставляСт собой Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Атрибуты Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ pthread_mutexattr_t, Π° условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ β€” pthread_condattr_t, ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

#include <pthread.h>

int pthread_mutexattr_init(pthread_mutexattr_t *attr);

int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);

int pthread_condattr_init(pthread_condattr_t *attr);

int pthread_condattr_destroy(pthread_condattr_t *attr);

/* ВсС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π•Ρ…Ρ…Ρ… – Π² случаС ошибки */

ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ нСскольким процСссам (Π° Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса). Π­Ρ‚ΠΎΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ…. Π•Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

#include <pthread.h>

int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr, int *valptr);

int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int value);

int pthread_condattr_getpshared(const pthread_condattr_t *attr, int *valptr);

int pthread_condattr_setpshared(pthread_condattr_t *attr, int value);

/* ВсС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π•Ρ…Ρ…Ρ… – Π² случаС ошибки */

Π”Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· Ρ†Π΅Π»ΠΎΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ valptr, Π° Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ set ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ value. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ value ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ PTHREAD_PROCESS_PRIVATE, Π»ΠΈΠ±ΠΎ PTHREAD_PROCESS_SHARED. ПослСднСС Ρ‚Π°ΠΊΠΆΠ΅ называСтся Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ совмСстного использования процСссами. 

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π­Ρ‚Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ поддСрТиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли константа _POSIX_THREAD_PROCESS_SHARED ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <unistd.h>. Она являСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ согласно Posix.1 ΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎ Unix 98 (Ρ‚Π°Π±Π». 1.3). 

ΠΠΈΠΆΠ΅ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСскольким процСссам:

pthread_mutex_t *mptr; /* ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, находящССся Π² раздСляСмой памяти */

pthread_mutexattr_t mattr; /* Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ */

…

mptr = /* Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Π½Π° Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ */

Pthread_mutexattr_init(&mattr);

#ifdef _POSIX_THREAD_PROCESS_SHARED

 Pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);

#else

 # error Π­Ρ‚Π° рСализация Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ _POSIX_THREAD_PROCESS_SHARED

#endif

Pthread_mutex_init(mptr, &mattr);

ΠœΡ‹ объявляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ mattr Ρ‚ΠΈΠΏΠ° pthread_mutexattr_t, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π΅ значСниями Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ устанавливаСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ PTHREAD_PROCESS_SHARED, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ нСскольким процСссам. Π—Π°Ρ‚Π΅ΠΌ pthread_mutex_init ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ само ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ раздСляСмой памяти, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слСдуСт Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎ sizeof(pthread_mutex_t).

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ такая ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ (с Π·Π°ΠΌΠ΅Π½ΠΎΠΉ mutex Π½Π° cond) позволяСт ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ PTHREAD_PROCESS_SHARED для условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, хранящСйся Π² раздСляСмой нСсколькими процСссами памяти.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… нСсколькими процСссами Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π±Ρ‹Π» ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 5.18.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅Π³ΠΎ рСсурс

Когда Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ совмСстно нСсколькими процСссами, всСгда сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ процСсс Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ) Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌ рСсурсом. НС сущСствуСт способа Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ систСму автоматичСски ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π²ΠΎ врСмя Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса. ΠœΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ это свойствСнно ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌ чтСния-записи, ΠΈ сСмафорам Posix. ЕдинствСнный Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, автоматичСски снимаСмых систСмой ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ процСсса, β€” Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ записСй fcntl (Π³Π»Π°Π²Π° 9). ΠŸΡ€ΠΈ использовании сСмафоров System V ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ядру, слСдуСт Π»ΠΈ автоматичСски ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСсса (функция SEM_UNDO, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 11.3).

ΠŸΠΎΡ‚ΠΎΠΊ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ рСсурсом, Ссли Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ (cancel) Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ ΠΎΠ½ сам Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ pthread_exit. ΠŸΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌΡƒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ Π½Π΅ слСдуСт ΡƒΠ΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ внимания, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ сам Π·Π½Π°Ρ‚ΡŒ, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π»ΠΈ ΠΎΠ½ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, ΠΈ Π² зависимости ΠΎΡ‚ этого Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ pthread_exit. На случай ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ρ‡Ρ‚ΠΎ продСмонстрировано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 8.5. Если ΠΆΠ΅ для ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ условия, это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ всСго процСсса. НапримСр, Ссли ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ сигнала SIGSEGV, это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ остановкС всСго процСсса, Ссли сигнал Π½Π΅ пСрСхватываСтся, ΠΈ ΠΌΡ‹ возвращаСмся ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ситуации с гибСлью процСсса, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅Π³ΠΎ рСсурс.

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

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях автоматичСскоС снятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (ΠΈΠ»ΠΈ счСтчика β€” для сСмафора) ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ процСсса Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. НапримСр, сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСмафор System V (с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SEM_UNDO) для подсчСта количСства ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ обслуТиваСмых ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ процСсса Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ fork ΠΎΠ½ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса. Если Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ досрочно, ядро само ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора. ΠŸΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ автоматичСскоС снятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ядром (Π° Π½Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ счСтчика, ΠΊΠ°ΠΊ Π² Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ ситуации) Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 9.7. Π”Π΅ΠΌΠΎΠ½ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ записи Π² Π½Π΅Π³ΠΎ ΠΈ Π½Π΅ снимаСт эту Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Если ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ копию Π΄Π΅ΠΌΠΎΠ½Π°, ΠΎΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ досрочно, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° запись. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ СдинствСнного экзСмпляра Π΄Π΅ΠΌΠΎΠ½Π°. Если ΠΆΠ΅ Π΄Π΅ΠΌΠΎΠ½ досрочно Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ядро само снимСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ копию Π΄Π΅ΠΌΠΎΠ½Π°.

7.8. РСзюмС

Π’Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (mutual exclusion β€” mutex) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ критичСских областСй ΠΊΠΎΠ΄Π°, запрСщая Π΅Π³ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΏΠΎΡ‚ΠΎΠΊΡƒ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅ΠΌΡƒ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, трСбуСтся Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ выполнСния ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ условия для выполнСния ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… дСйствий. Π’ этом случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ сигнала ΠΏΠΎ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Условная пСрСмСнная всСгда связываСтся с ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ. Ѐункция pthread_cond_wait, ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰Π°Ρ Ρ€Π°Π±ΠΎΡ‚Ρƒ процСсса, Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ остановкой Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСсса спустя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя. Π‘ΠΈΠ³Π½Π°Π» ΠΏΠΎ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ пСрСдаСтся ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΈ этот ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΡ‚ΡŒ Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· мноТСства ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… (pthread_cond_signal), Π»ΠΈΠ±ΠΎ всС ΠΈΡ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ (pthread_cond_broadcast).

Π’Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ статичСскими. Π’ этом случаС ΠΎΠ½ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ статичСски. Они ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ динамичСскими, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ динамичСской ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ДинамичСская инициализация Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π² частности Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ совмСстного использования нСсколькими процСссами, Ρ‡Ρ‚ΠΎ дСйствСнно, Ссли Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ условная пСрСмСнная находится Π² раздСляСмой этими процСссами памяти.

УпраТнСния