test_lock.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <stdio.h>
  2. #include <toolkit.h>
  3. toolkit_barrier_t blocker;
  4. toolkit_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. toolkit_rwlock_rdlock(&numlock);
  12. printf("Reader %d: acquired lock\n", num);
  13. printf("Reader %d: shared num = %d\n", num, shared_num);
  14. toolkit_rwlock_rdunlock(&numlock);
  15. printf("Reader %d: released lock\n", num);
  16. }
  17. toolkit_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. toolkit_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. toolkit_rwlock_wrunlock(&numlock);
  29. printf("Writer %d: released lock\n", num);
  30. }
  31. toolkit_barrier_wait(&blocker);
  32. }
  33. int main()
  34. {
  35. toolkit_barrier_init(&blocker, 4);
  36. shared_num = 0;
  37. toolkit_rwlock_init(&numlock);
  38. toolkit_thread_t threads[3];
  39. int thread_nums[] = { 1, 2, 1 };
  40. toolkit_thread_create(&threads[0], reader, &thread_nums[0]);
  41. toolkit_thread_create(&threads[1], reader, &thread_nums[1]);
  42. toolkit_thread_create(&threads[2], writer, &thread_nums[2]);
  43. toolkit_barrier_wait(&blocker);
  44. toolkit_barrier_destroy(&blocker);
  45. toolkit_rwlock_destroy(&numlock);
  46. return 0;
  47. }