/* ======================================================================= Mutex example: deadlock because not unlocking a mutex... ======================================================================= */ #include #include #include int N; // Shared variable pthread_mutex_t N_mutex; // Mutex controlling access to N pthread_t tid[100]; void *worker(void *arg) { int i; for (i = 0; i < 10000; i = i + 1) { pthread_mutex_lock(&N_mutex); N = N + 1; // pthread_mutex_unlock(&N_mutex); -- See what happens now... } cout << "Added 10000 to N" << endl; return(NULL); /* Thread exits (dies) */ } /* ======================= MAIN ======================= */ int main(int argc, char *argv[]) { int i, num_threads; /* ----- Check command line ----- */ if ( argc != 2 ) { cout << "Usage: " << argv[0] << " Num_Threads" << endl; exit(1); } /* ----- Initialize mutex ----- */ pthread_mutex_init(&N_mutex, NULL); num_threads = atoi(argv[1]); N = 0; // Do we need pthread_mutex_lock(&N_mutex); ??? // ?????? cout << "Setting N to 0" << endl; /* ------ Create threads ------ */ for (i = 0; i < num_threads; i = i + 1) { if ( pthread_create(&tid[i], NULL, worker, NULL) ) { cout << "Cannot create thread" << endl; exit(1); } } for (i = 0; i < num_threads; i = i + 1) pthread_join(tid[i], NULL); cout << "N = " << N << endl << endl; }