ABBA_2threads.c 836 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. pthread_mutex_t a = PTHREAD_MUTEX_INITIALIZER;
  4. pthread_mutex_t b = PTHREAD_MUTEX_INITIALIZER;
  5. pthread_barrier_t bar;
  6. void *ba_lock(void *arg)
  7. {
  8. int ret, i;
  9. pthread_mutex_lock(&b);
  10. if (pthread_barrier_wait(&bar) == PTHREAD_BARRIER_SERIAL_THREAD)
  11. pthread_barrier_destroy(&bar);
  12. pthread_mutex_lock(&a);
  13. pthread_mutex_unlock(&a);
  14. pthread_mutex_unlock(&b);
  15. }
  16. int main(void)
  17. {
  18. pthread_t t;
  19. pthread_barrier_init(&bar, NULL, 2);
  20. if (pthread_create(&t, NULL, ba_lock, NULL)) {
  21. fprintf(stderr, "pthread_create() failed\n");
  22. return 1;
  23. }
  24. pthread_mutex_lock(&a);
  25. if (pthread_barrier_wait(&bar) == PTHREAD_BARRIER_SERIAL_THREAD)
  26. pthread_barrier_destroy(&bar);
  27. pthread_mutex_lock(&b);
  28. pthread_mutex_unlock(&b);
  29. pthread_mutex_unlock(&a);
  30. pthread_join(t, NULL);
  31. return 0;
  32. }