ABBA_2threads.c 872 B

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