/* * compteurBOOM_v3_N_threads_mutex.c * * Version multithread utilisant un mutex pour protéger les accès à counter. */ #include #include #include #include #include #include #define FINAL_COUNTER 200000000 #define NB_THREAD 8 int counter = 0; pthread_mutex_t lock; void *start_routine(void *arg) { int i; for (i = 0; i < FINAL_COUNTER / NB_THREAD; i++) { pthread_mutex_lock(&lock); // Prend le verrou counter ++; pthread_mutex_unlock(&lock); // Libère le verrou } pthread_exit(NULL); } int main (int argc, char *argv[]) { int rc; pthread_t thread[NB_THREAD]; assert(FINAL_COUNTER % NB_THREAD == 0); // Pour verifier que, si on repartit le travail d'incrementation de counter entre NB_THREAD, on est certain d'obtenir FINAL_COUNTER. pthread_mutex_init(&lock, NULL); // Initialise le verrou for (int i = 0; i < NB_THREAD; i++) { rc = pthread_create(&thread[i], NULL, start_routine, NULL); if (rc) error(EXIT_FAILURE, rc, "pthread_create"); } for (int i = 0; i < NB_THREAD; i++) { rc = pthread_join(thread[i], NULL); if (rc) error(EXIT_FAILURE, rc, "pthread_join"); } if (counter != FINAL_COUNTER) printf("BOOM! counter = %d\n", counter); else printf("OK counter = %d\n", counter); pthread_mutex_destroy(&lock); // Detruit le verrou exit(EXIT_SUCCESS); }