#include #include #include #ifdef WIN32 /* MS-Windows */ #include #define msleep(ms) Sleep(ms) #else /* unixoides */ #include #define msleep(ms) usleep((ms * 1000)) #endif pthread_t id_t1, id_t2; pthread_attr_t t_attr; pthread_mutex_t mutex_un; pthread_mutexattr_t mutex_attr; int un_compteur = 0; using namespace std; void* fonct_thread1(void* arg){ int rc; while (un_compteur < 10) { if ((rc = pthread_mutex_lock(&mutex_un)) != 0) { cerr << "pthread_mutex_lock() s'est planté avec la valeur rc = " << rc << ".\n"; exit(-1); } if (un_compteur < 10) { un_compteur++; } cout << "Thread 1 = " << setw(2) << setfill('0') << un_compteur << "\n"; if ((rc = pthread_mutex_unlock(&mutex_un)) != 0) { cerr << "pthread_mutex_unlock() s'est planté avec la valeur rc = " << rc << ".\n"; exit(-1); } msleep(1); } return NULL; } void* fonct_thread2(void* arg){ int rc; while (un_compteur < 10) { if ((rc = pthread_mutex_lock(&mutex_un)) != 0) { cerr << "pthread_mutex_lock() s'est planté avec la valeur rc = " << rc << ".\n"; exit(-1); } if (un_compteur < 10) { un_compteur++; } cout << "Thread 2 = " << setw(2) << setfill('0') << un_compteur << "\n"; if ((rc = pthread_mutex_unlock(&mutex_un)) != 0) { cerr << "pthread_mutex_unlock() s'est planté avec la valeur rc = " << rc << ".\n"; exit(-1); } msleep(1); } return NULL; } int main(int argc, char* argv[]){ int rc, status; if ((rc = pthread_mutexattr_init(&mutex_attr)) != 0) { cerr << "pthread_mutexattr_init() s'est planté avec la valeur rc = " << rc << ".\n"; exit(-1); } if ((rc = pthread_mutex_init(&mutex_un, &mutex_attr)) != 0) { cerr << "pthread_mutex_init() s'est planté avec la valeur rc = " << rc << ".\n"; exit(-1); } if ((rc = pthread_attr_init(&t_attr)) != 0) { cerr << "pthread_attr_init() s'est planté avec la valeur rc = " << rc << ".\n"; exit(-1); } if ((rc = pthread_create(&id_t1, &t_attr, fonct_thread1, 0)) != 0) { cerr << "pthread_create(#1) fs'est planté avec la valeur rc = " << rc << ".\n"; exit(-1); } if ((rc = pthread_create(&id_t2, &t_attr, fonct_thread2, 0)) != 0) { cerr << "pthread_create(#2) s'est planté avec la valeur rc = " << rc << ".\n"; exit(-1); } pthread_attr_destroy(&t_attr); pthread_join(id_t1, (void **)&status); pthread_join(id_t2, (void **)&status); cout << "\nLa somme est = " << un_compteur << endl; pthread_mutex_destroy(&mutex_un); pthread_exit(NULL); }