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