1#include <stdio.h>
2#include <uv.h>
3
4uv_barrier_t blocker;
5uv_rwlock_t numlock;
6int shared_num;
7
8void 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
22void 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
37int 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