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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈ распрСдСлСнноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 58

Автор Π₯ьюз ΠšΠ°ΠΌΠ΅Ρ€ΠΎΠ½

β€’ PTHREAD_PROCESS_SHARED (Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния-записи, Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ Π»ΡŽΠ±Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ для этой условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ процСссам);

β€’ PTHREAD_PROCESS_PRIVATE (Условная ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ раздСляСтся ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса)

β€’ int pthread_condattr_setclock ( pthread_condattr_t * attr, clockid_t clock_id);

β€’ int pthread_condattr_getclock ( const pthread_condattr_t * restrict attr, clockid_t * restrict clock_id); УстанавливаСт ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ clock Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr . Атрибут clock прСдставляСт собой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ часов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для измСрСния Π»ΠΈΠΌΠΈΡ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_timedwait (). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° clock ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ систСмных часов

ИспользованиС условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для управлСния ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΠΌΠΈ синхронизации

Π£ΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ синхронизации, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅: старт-старт (CC), Ρ„ΠΈΠ½ΠΈΡˆ-старт (Π€Π‘), старт-Ρ„ΠΈΠ½ΠΈΡˆ (Π‘Π€) ΠΈ Ρ„ΠΈΠ½ΠΈΡˆ-Ρ„ΠΈΠ½ΠΈΡˆ (Π€Π€). Π­Ρ‚ΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… процСссов. Π’ листингах 5.4 ΠΈ 5.5 прСдставлСны ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π€Π‘- ΠΈ Π€Π€-ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ синхронизации. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π΄Π²Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Один ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для синхронизации доступа ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” для синхронизации выполнСния ΠΊΠΎΠ΄Π°.

// Листинг 5.4. Π€Π‘-ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ синхронизации ΠΌΠ΅ΠΆΠ΄Ρƒ

// двумя ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ

//. . .

float Number;

pthread_t ThreadA,ThreadB;

pthread_mutex_t Mutex, EventMutex;

pthread_cond_t Event;

void * worker1 (void *X) {

for(int Count = l;Count < 100;Count++){

pthread_mutex_lock(&Mutex);

Number++;

pthread_mutex_unlock(&Mutex);

cout << Β«worker1: число Ρ€Π°Π²Π½ΠΎΒ» << Number << endl;

if(Number == 50){

pthread_cond_signal(&Event);

}

}

cout << Β«Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΠΈΠΈΠΈ worker1 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ.Β» << endl;

return(0);

}

void * worker2 (void *X) {

pthread_mutex_lock(&EventMutex);

pthread_cond_wait(&Event,&EventMutex);

pthread_mutex_unlock(&EventMutex);

for(int Count = 1;Count < 50;Count++){

pthread_mutex_lock(&Mutex);

Number = Number + 20;

pthread_mutex_unlock(&Mutex);

cout << Β«worker2: число Ρ€Π°Π²Π½ΠΎΒ» << Number << endl;

}

cout Β« Β«Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ worker2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ.Β» Β« endl; return(0);

};

int main (int argc, char *argv[]) {

pthread_mutex_init(&Mutex,NULL);

pthread_mutex_init(&EventMutex,NULL);

pthread_cond_init(&Event, NULL);

pthread_create(&ThreadA, NULL, workerl, NULL);

pthread_create(&ThreadB, NULL, worker2 , NULL);

//. . .

return (0);

}

Π’ листингС 5.4 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π€Π‘-ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ синхронизации. ΠŸΠΎΡ‚ΠΎΠΊ ThreadA Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ стартуСт ΠΏΠΎΡ‚ΠΎΠΊ ThreadB. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Number станСт Ρ€Π°Π²Π½Ρ‹ΠΌ 50, ΠΏΠΎΡ‚ΠΎΠΊ ThreadA сигнализируСт ΠΎ этом ΠΏΠΎΡ‚ΠΎΠΊΡƒ ThreadB. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ самого ΠΊΠΎΠ½Ρ†Π° ΠŸΠΎΡ‚ΠΎΠΊ ThreadB Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сигнал ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° ThreadA. ΠŸΠΎΡ‚ΠΎΠΊ ThreadB ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ EventMutex вмСстС с условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Event. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Mutex ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для синхронизации доступа для записи значСния раздСляСмой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Number. Для синхронизации Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… событий ΠΈ доступа ΠΊ критичСским Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌ Π·Π°Π΄Π°Ρ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π€Π€-ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ синхронизации ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² листингС 5.5.

// Листинг 5.5. Π€Π€-ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ синхронизации ΠΌΠ΅ΠΆΠ΄Ρƒ // двумя ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ

//...

float Number;

pthread_t ThreadA, ThreadB ;

pthread_mutex_t Mutex, EventMutex;

pthread_cond_t Event;

void *workerl(void *X) {

for(int Count = l;Count < 10;Count++){

pthread_mu tex_l ock (&Mutex);

Number++;

pthread_mutex_unlосk(&Mutex);

cout Β« Β«workerl: число Ρ€Π°Π²Π½ΠΎ " << Number Β« endl;

}

pthread_mutex_lock(&EventMutex) ,-

cout Β« «Ѐункция workerl Π² состоянии оТидания. " Β« endl;

pthread_cond_wait (&Event, &EventMutex) ;

pthread_mutex_unlock(&EventMutex);

return(0);

}

void *worker2 (void *X) {

for(int Count = l;Count < 100;Count++){

pthread_mutex_lock(&Mutex) ;

Number = Number * 2 ;

pthread_mutex_unlock(&Mutex) ;

cout Β« Β«worker2: число Ρ€Π°Π²Π½ΠΎ " Β« Number Β« endl;

}

pthread_cond_signal (&Event) ;

cout Β« «Ѐункция worker2 послала сигнал " Β« endl; return(0);

}

int main(int argc, char *argv[]) {

pthread_mutex_init (&Mutex,NULL) ;

pthread_mutex_init (&EventMutex,NULL) ;

pthread_cond_init (&Event, NULL) ;

pthread_create(&ThreadA, NULL,workerl, NULL);

pthread_create (&ThreadB, NULL, worker2, NULL) ;

//.. .

return (0);

}

Π’ листингС 5.5 ΠΏΠΎΡ‚ΠΎΠΊ ThreadA Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊ ThreadB. ΠŸΠΎΡ‚ΠΎΠΊ ThreadA Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ» 10 Ρ€Π°Π·, Π° ThreadB β€” 100. ΠŸΠΎΡ‚ΠΎΠΊ ThreadA Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ своих ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Ρ€Π°Π½ΡŒΡˆΠ΅ ThreadB, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ ThreadB Π½Π΅ просигналит ΠΎ своСм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ.

CC- ΠΈ Π‘Π€-ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ синхронизации Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для синхронизации ΠΏΠΎΡ€ я Π΄ΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈ я процСссов.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ синхронизации

Одно ΠΈΠ· прСимущСств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования состоит Π² Π·Π°Ρ‰ΠΈΡ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ обСспСчиваСт инкапсуляция ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² «стратСгии доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈΡ… примСнСния» [ 24 ]. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, прСдставлСнных Π² этой Π³Π»Π°Π²Π΅, Π·Π° примСняСмыС стратСгии доступа вся ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ возлагалась Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ инкапсуляции ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠΈΡ‚ΡŒ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° сами Π΄Π°Π½Π½Ρ‹Π΅. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ бСзопасными для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ прилоТСния (ΠΏΠΎ возмоТности) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π‘++-конструкций class ΠΈΠ»ΠΈ struct. Π—Π°Ρ‚Π΅ΠΌ инкапсулируйтС Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ синхронизации, ΠΊΠ°ΠΊ сСмафоры, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для обСспСчСния чтСния-записи ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ событий. Если Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ синхронизации ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, создайтС для Π½ΠΈΡ… интСрфСйсный класс. НаконСц, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ синхронизации посрСдством наслСдования ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ бСзопасны для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассматриваСтся Π² Π³Π»Π°Π²Π΅ 11.

РСзюмС

Для ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ порядка выполнСния процСссов ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (синхронизация Π·Π°Π΄Π°Ρ‡), Π° Ρ‚Π°ΠΊΠΆΠ΅ доступа ΠΊ раздСляСмым Π΄Π°Π½Π½Ρ‹ΠΌ (синхронизация Π΄Π°Π½Π½Ρ‹Ρ…) ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ синхронизации. Π‘Ρƒ Ρ‰ СствуСт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ основных Π²ΠΈΠ΄Π° ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ синхронизации Π·Π°Π΄Π°Ρ‡. ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° «старт-старт» (CC) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° А Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ начнСтся Π·Π°Π΄Π°Ρ‡Π° Π’. ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° Β«Ρ„ΠΈΠ½ΠΈΡˆ-старт» (Π€Π‘) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° А Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ начнСтся Π·Π°Π΄Π°Ρ‡Π° Π’. ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° «старт-Ρ„ΠΈΠ½ΠΈΡˆΒ» (Π‘Π€) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° А Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π·Π°Π΄Π°Ρ‡Π° Π’. ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° Β«Ρ„ΠΈΠ½ΠΈΡˆ-Ρ„ΠΈΠ½ΠΈΡˆΒ» (Π€Π€) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ задачаА Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π·Π°Π΄Π°Ρ‡Π° Π’. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этих ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ синхронизации Π·Π°Π΄Π°Ρ‡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ pthread_cond_t, которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° стандартом POSIX.