main.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <stdio.h>
  2. #include <uv.h>
  3. uv_barrier_t blocker;
  4. uv_rwlock_t numlock;
  5. int shared_num;
  6. void reader(void *n)
  7. {
  8. int num = *(int *)n;
  9. int i;
  10. for (i = 0; i < 20; i++) {
  11. uv_rwlock_rdlock(&numlock);
  12. printf("Reader %d: acquired lock\n", num);
  13. printf("Reader %d: shared num = %d\n", num, shared_num);
  14. uv_rwlock_rdunlock(&numlock);
  15. printf("Reader %d: released lock\n", num);
  16. }
  17. uv_barrier_wait(&blocker);
  18. }
  19. void writer(void *n)
  20. {
  21. int num = *(int *)n;
  22. int i;
  23. for (i = 0; i < 20; i++) {
  24. uv_rwlock_wrlock(&numlock);
  25. printf("Writer %d: acquired lock\n", num);
  26. shared_num++;
  27. printf("Writer %d: incremented shared num = %d\n", num, shared_num);
  28. uv_rwlock_wrunlock(&numlock);
  29. printf("Writer %d: released lock\n", num);
  30. }
  31. uv_barrier_wait(&blocker);
  32. }
  33. int main()
  34. {
  35. uv_barrier_init(&blocker, 4);
  36. shared_num = 0;
  37. uv_rwlock_init(&numlock);
  38. uv_thread_t threads[3];
  39. int thread_nums[] = {1, 2, 1};
  40. uv_thread_create(&threads[0], reader, &thread_nums[0]);
  41. uv_thread_create(&threads[1], reader, &thread_nums[1]);
  42. uv_thread_create(&threads[2], writer, &thread_nums[2]);
  43. uv_barrier_wait(&blocker);
  44. uv_barrier_destroy(&blocker);
  45. uv_rwlock_destroy(&numlock);
  46. return 0;
  47. }