#include #include #include #include static int counter; static pthread_mutex_t l1 = PTHREAD_MUTEX_INITIALIZER; // protects counter static pthread_mutex_t l2 = PTHREAD_MUTEX_INITIALIZER; // protects counter again static void *thread(void * _tn) { for (int i = 0; i < 1000000; i++) { pthread_mutex_lock(&l1); pthread_mutex_lock(&l2); counter++; pthread_mutex_unlock(&l2); pthread_mutex_unlock(&l1); } return NULL; } int main() { int i, N = 10; pthread_t t[N]; for (i = 0; i < N; i++) pthread_create(t + i, NULL, thread, NULL); for (i = 0; i < N; i++) pthread_join(t[i], NULL); printf("counter = %d\n", counter); return 0; }