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