/* * compteurBOOM_v2_N_threads.c * * Version multithread avec N threads. */ #include #include #include #include #include #include #define FINAL_COUNTER 200000000 #define NB_THREAD 8 int counter = 0; void *start_routine(void *arg) { int i; for (i = 0; i < FINAL_COUNTER / NB_THREAD; i++) { /* OOPS: WRONG ! Access to an unprotected shared variable */ counter ++; } 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. 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); exit(EXIT_SUCCESS); }