Π‘ΠΈΠ½ΠΎΠΏΡΠΈΡ
#include <pthread.h>
void pthread_testcancel(void)
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 4.3 ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_setcancelstate(), pthread_setcanceltype() ΠΈ pthread_testcancel(), ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ ΡΠΈΠΏΠ° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΊ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
#include <iostream>
#include <pthread.h>
void *task1(void *X)
{
int OldState;
// disable cancelability
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&OldState);
for(int Count = 1;Count < 100;Count++)
{
cout << Β«thread A is working: " << Count << endl;
}
}
void *task2(void *X)
{
int OldState,OldType;
// enable cancelability, asynchronous
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&OldState);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&OldType);
for(int Count = 1;Count < 100;Count++)
{
cout << Β«thread B is working: " << Count << endl;
}
}
void *task3(void *X)
{
int OldState,OldType;
// enable cancelability, deferred
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&OldState);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,&OldType);
for(int Count = 1;Count < 1000;Count++)
{
cout << Β«thread C is working: " << Count << endl;
if((Count%100) == 0){
pthread_testcancel();
}
}
}
Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ 4.3 ΠΊΠ°ΠΆΠ΄Π°Ρ Π·Π°Π΄Π°ΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ²ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. Π Π·Π°Π΄Π°ΡΠ΅ task1 Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° Π·Π°ΠΏΡΠ΅ΡΠ΅Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΡ ΠΎΠ½Π° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ°. Π Π·Π°Π΄Π°ΡΠ΅ task2 Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ. ΠΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_setcancelstate () ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ Π½ΠΎΠ²ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΈΠΌΠ΅ΡΡ ΡΡΠ°ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. Π’ΠΈΠΏ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π΄Π΅ΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°Π²Π½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ PTHREAD_CANCEL_ASYNCHRONOUS ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, Π½Π° ΠΊΠ°ΠΊΠΎΠΉ ΡΡΠ°ΠΏ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΡΠΎΡ Π·Π°ΠΏΡΠΎΡ. Π ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» Π΄Π»Ρ ΡΠ΅Π±Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π·Π½Π°ΡΠΈΡ, ΠΎΠ½ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Β«ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠ³ΠΎΒ» ΠΊΠΎΠ΄Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠ·ΠΎΠ²Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ ΠΏΠΎΠ΄ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ ΠΎΠΏΠ°ΡΠ½ΡΡ Π΄Π»Ρ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ Π² Π·Π°Π΄Π°ΡΠ΅ task2 ΡΠ°ΠΊΠΈΡ Π½Π΅Ρ. Π’Π°ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π»ΠΈΡΡ ΡΠΈΠΊΠ», ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΡΡΡΠΏΠΈΡ Π·Π°ΠΏΡΠΎΡ Π½Π° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. Π Π·Π°Π΄Π°ΡΠ΅ task3 Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ, Π° ΡΠΈΠΏ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°Π²Π½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ PTHREAD_CANCEL_DEFFERED. ΠΡΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ ΡΠΈΠΏ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π½ΠΎΠ²ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ pthread_setcancelstate() ΠΈ pthread_setcanceltype() Π·Π΄Π΅ΡΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Ρ. ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π·Π΄Π΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ ΡΠΈΠΏΠ° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π½Π΅ ΡΡΠ°ΡΡΡΠ΅Ρ Π΄ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ pthread_testcancel (). ΠΡΠ»ΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Ρ ΠΆΠ΄ΡΡΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ, ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π²ΡΡΡΠ΅ΡΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_testcancel() (Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Ρ). Π Π·Π°Π΄Π°ΡΠ΅ task3 ΡΡΠ½ΠΊΡΠΈΡ pthread_cancel () Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Count Π±Π΅Π· ΠΎΡΡΠ°ΡΠΊΠ° ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡΡ Π½Π° ΡΠΈΡΠ»ΠΎ 100 . ΠΠΎΠ΄, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΡΠΊΠ°ΠΌΠΈ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 4.4 ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π΅Π»Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡ Π½Π° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
// ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 4.4
int main(int argc, char *argv[]) {
pthread_t Threads[3]; void *Status;
pthread_create(&(Threads[0]),NULL,taskl, NULL); pthread_create(&(Threads[l]), NULL,task2,NULL); pthread_create(&(Threads[2]),NULL,task3,NULL);
pthread_cancel(Threads[0]); pthread_cancel(Threads[l]); pthread_cancel(Threads[2]);
for(int Count = 0;Count < 3;Count++) {
pthread_join(Threads[Count],&Status); if(Status == PTHREAD_CANCELED){
cout << Β«ΠΠΎΡΠΎΠΊΒ» << Count << " Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½.Β» << endl;
}
else{
cout Β« Β«ΠΠΎΡΠΎΠΊΒ» << Count << " ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.Β» << endl;
}
}
return (0) ;
}
Π£ΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ 4.4 ΡΠ½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΠΈ ΡΠ°Π±ΠΎΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°, Π·Π°ΡΠ΅ΠΌ Π΄Π΅Π»Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡ Π½Π° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ . Π£ΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ pthread_join(). ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΆΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½, ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠ°ΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. Π ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΌΠ° ΠΊΡΡΠ°ΡΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΄Π΅Π»Π°Π» Π·Π°ΠΏΡΠΎΡ Π½Π° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΈ ΠΏΠΎΡΠΎΠΊ, Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΡ pthread_join (), ΠΌΠΎΠ³ΡΡ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Β«ΠΏΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΡΠ΅Π»ΡΡΡΠ²ΡΒ» ΠΈ Π°Π½Π½ΡΠ»ΠΈΡΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΈ. ΠΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΠΆΠ΅ ΡΡΠ°ΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_join() ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΡΠΎΡ ΡΠΈΠΏ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΡΠ΅Π½ΠΊΠΈ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ² Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½. Π ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠΉ Π½Π°ΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π²ΡΠ΅ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ: Π² ΡΠΈΠΊΠ»Π΅ ΠΎΠ½ ΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΈΡ ΡΡΠ°ΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ. ΠΠΎΡΠΎΠΊ Threads[0] Π½Π΅ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ Π·Π°ΠΏΡΠ΅Ρ Π½Π° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Π΄Π²Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠ° Π±ΡΠ»ΠΈ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½Ρ. Π‘ΡΠ°ΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π°Π½Π½ΡΠ»ΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ PTHREAD_CANCELED. ΠΡΠΎΡΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ 4.3 ΠΈ 4.4 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Β«ΠΡΠΎΡΠΈΠ»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ 4.2Β».
ΠΡΠΎΡΠΈΠ»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ 4.2
ΠΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ program4-34. cc ;
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π’ΡΠΈ ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΈΠΊΠ». Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ ΡΠΈΠΏ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΈΠΊΠ»Π° ΠΈ ΡΠΎ, Π±ΡΠ΄Π΅Ρ Π»ΠΈ ΡΠΈΠΊΠ» Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π²ΠΎΠΎΠ±ΡΠ΅. ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΠ°ΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ , ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
Π’ΡΠ΅Π±ΡΠ΅ΠΌΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°libpthread
Π’Ρ Π΅Π±ΡΠ΅ΠΌΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ<pthread.h> <iostream>
ΠΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ
Ρ++ -ΠΎ program4-34 program4-34.ΡΡ -lpthread
Π‘ΡΠ΅Π΄Π° Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ SuSE Linux 7.1, gcc 2.95.2.
Π Π½Ρ ΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ./program4-34
Π ΡΡΠ½ΠΊΡΠΈΡΡ , ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΎΡΠΊΠΈ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_testcancel(). ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Pthread ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΎΡΠ΅ΠΊ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ, Π° Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Π³ΡΠΎΠ·ΠΈΡ. ΠΠΎΡ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Pthread:
pthread_testcancel()
pthread_cond_wait()
pthread_timedwait()
pthread_join()
ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ, ΠΏΡΠ΅Π±ΡΠ²Π°ΡΡΠΈΠΉ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΎΡΡΡΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΈΠΌΠ΅Π΅Ρ ΠΆΠ΄ΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ Π½Π° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΡΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ Π²ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Pthread Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°Π½Π° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΡΠ΅ΡΠ΅Π½Π΄ΡΡΡΠΈΡ Π½Π° ΡΠΎΠ»Ρ ΡΠΎΡΠ΅ΠΊ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π² ΡΠ°Π±Π». 4.6.
Π’Π°Π±Π»ΠΈΡΠ° 4.6. Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ POSIX-ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠ΅ΡΠ΅Π½Π΄ΡΡΡΠΈΠ΅ Π½Π° ΡΠΎΠ»Ρ ΡΠΎΡΠ΅ΠΊ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ