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