1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int iTab_Compteur[] = {
0, 0, 0, 0 };
void *f_Thread_A(void*);
void *f_Thread_B(void*);
void *f_Thread_C(void*);
void *f_Thread_D(void*);
void *f_Thread_E( void *);
void *f_Thread_A( void *pData ){
pData = NULL;
fprintf( stdout,"[\tA\t]Thread A s'exécute et peut s'arrêter à tout moment\n");
pthread_testcancel();
while( iTab_Compteur[0] < INTMAX_MIN ){
pthread_testcancel();
iTab_Compteur[0]++;
}
pthread_testcancel();
fprintf( stderr,
"\nErreur Critique-> [\tA\t] -> Si y a Cancel normalement je m'exécute pas !!\n" );
return NULL;
}
void *f_Thread_B( void *pData ){
pData = NULL;
fprintf( stdout,"[\tB\t]Thread B s'exécute .....\n");
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL );
pthread_testcancel();
fprintf( stdout,"[\tB\t]Thread B s'exécute et j'ignore tout cancel \n");
pthread_testcancel();
while( iTab_Compteur[1] < INTMAX_MIN ){
pthread_testcancel();
iTab_Compteur[1]++;
}
pthread_testcancel();
fprintf( stderr,
"[\tB\t] -> il y a cancel normalement je m'exécute par maïs ici je l'ignore !!\n");
return NULL;
}
void *f_Thread_C( void *pData ){
pData = NULL;
fprintf( stdout,"[\tC\t]Thread C s'exécute .....\n");
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
fprintf( stdout, "[\tC\t]Thread C s'exécute toujours et j'arrête à tout moment\n");
pthread_testcancel();
while( iTab_Compteur[2] < INTMAX_MIN ){
pthread_testcancel();
iTab_Compteur[2]++;
}
pthread_testcancel();
fprintf( stderr,
"\nErreur Critique->[\tC\t] -> Si y a cancel normalement j'exécute pas cette ligne!!\n" );
return NULL;
}
void *f_Thread_D( void *pData ){
pData = NULL;
fprintf( stdout,"[\tD\t]Thread D s'exécute......\n");
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
fprintf( stdout, "[\tD\t]thread D s'exécute encore et je ne m'arrête qu'après traitement\n");
while( iTab_Compteur[3] < INTMAX_MIN ){
pthread_testcancel();
iTab_Compteur[3]++;
}
pthread_testcancel();
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
fprintf( stdout, "[\tD\t]Thread D s'exécute toujours mais j'ignore plus les cancels \n");
pthread_testcancel();
while( iTab_Compteur[3] < INTMAX_MIN ){
pthread_testcancel();
iTab_Compteur[3]--;
}
fprintf( stdout,"[\tD\t]Thread D s'exécute prend en compte tout cancel \n");
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
pthread_testcancel();
fprintf( stdout, "[\tD\t]Thread D s'exécute toujours et je peux m'arrêter à tout moment\n");
while( iTab_Compteur[3] < INTMAX_MIN )
iTab_Compteur[3]++;
fprintf( stderr, "\nErreur Critique->[\tD\t] -> Si y a cancel normalement je m'exécute pas !!\n" );
return NULL;
}
void *f_Thread_E( void *pData ){
pData = NULL;
fprintf( stdout,"[\tE\t]Thread E s'exécute ... \n");
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,
NULL);
fprintf( stdout,"[\tE\t]Thread E s'exécute et j'ignore tout cancel \n");
fprintf( stdout, "[\tE\t]Thread E s'exécute et je ne m'arrête qu'après traitement\n");
while( iTab_Compteur[4] < INTMAX_MIN )
iTab_Compteur[4]++;
fprintf( stdout,"[\tE\t]Thread E s'exécute encore et j'ignore tout cancel \n");
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,
NULL);
fprintf( stdout, "[\tE\t]Thread E s'exécute et peut s'arrêter à tout moment \n");
pthread_testcancel();
while( iTab_Compteur[4] < INTMAX_MIN )
iTab_Compteur[4]--;
fprintf( stderr, "\nErreur Critique -> [\tE\t] -> Si y a cancel normalement je m'exécute pas !!\n" );
}
int main( void ){
int i = 0;
pthread_t tab_thread[5];
const int inb_thread = 4;
pthread_create( &tab_thread[0], 0, f_Thread_A, (void*)i );
pthread_create( &tab_thread[1], 0, f_Thread_B, (void*)i );
pthread_create( &tab_thread[2], 0, f_Thread_C, (void*)i );
pthread_create( &tab_thread[3], 0, f_Thread_D, (void*)i );
pthread_create( &tab_thread[4], 0, f_Thread_E, (void*)i );
for( i = 0; i < inb_thread; i++ )
pthread_cancel(tab_thread[i]);
for( i = 0; i < inb_thread; i++ )
pthread_join(tab_thread[i], NULL );
fprintf( stdout, "======\n" );
for( i = 0; i < 5; i++ )
fprintf( stdout, "Thread[%c]\t:%d\n",
(i == 0) ? 'A' : (i == 1) ? 'B': (i == 2) ? 'C' : (i == 3) ? 'D': 'E' );
return EXIT_SUCCESS;
} |