Blame docs/code/locks/main.c

Packit b5b901
#include <stdio.h>
Packit b5b901
#include <uv.h>
Packit b5b901
Packit b5b901
uv_barrier_t blocker;
Packit b5b901
uv_rwlock_t numlock;
Packit b5b901
int shared_num;
Packit b5b901
Packit b5b901
void reader(void *n)
Packit b5b901
{
Packit b5b901
    int num = *(int *)n;
Packit b5b901
    int i;
Packit b5b901
    for (i = 0; i < 20; i++) {
Packit b5b901
        uv_rwlock_rdlock(&numlock);
Packit b5b901
        printf("Reader %d: acquired lock\n", num);
Packit b5b901
        printf("Reader %d: shared num = %d\n", num, shared_num);
Packit b5b901
        uv_rwlock_rdunlock(&numlock);
Packit b5b901
        printf("Reader %d: released lock\n", num);
Packit b5b901
    }
Packit b5b901
    uv_barrier_wait(&blocker);
Packit b5b901
}
Packit b5b901
Packit b5b901
void writer(void *n)
Packit b5b901
{
Packit b5b901
    int num = *(int *)n;
Packit b5b901
    int i;
Packit b5b901
    for (i = 0; i < 20; i++) {
Packit b5b901
        uv_rwlock_wrlock(&numlock);
Packit b5b901
        printf("Writer %d: acquired lock\n", num);
Packit b5b901
        shared_num++;
Packit b5b901
        printf("Writer %d: incremented shared num = %d\n", num, shared_num);
Packit b5b901
        uv_rwlock_wrunlock(&numlock);
Packit b5b901
        printf("Writer %d: released lock\n", num);
Packit b5b901
    }
Packit b5b901
    uv_barrier_wait(&blocker);
Packit b5b901
}
Packit b5b901
Packit b5b901
int main()
Packit b5b901
{
Packit b5b901
    uv_barrier_init(&blocker, 4);
Packit b5b901
Packit b5b901
    shared_num = 0;
Packit b5b901
    uv_rwlock_init(&numlock);
Packit b5b901
Packit b5b901
    uv_thread_t threads[3];
Packit b5b901
Packit b5b901
    int thread_nums[] = {1, 2, 1};
Packit b5b901
    uv_thread_create(&threads[0], reader, &thread_nums[0]);
Packit b5b901
    uv_thread_create(&threads[1], reader, &thread_nums[1]);
Packit b5b901
Packit b5b901
    uv_thread_create(&threads[2], writer, &thread_nums[2]);
Packit b5b901
Packit b5b901
    uv_barrier_wait(&blocker);
Packit b5b901
    uv_barrier_destroy(&blocker);
Packit b5b901
Packit b5b901
    uv_rwlock_destroy(&numlock);
Packit b5b901
    return 0;
Packit b5b901
}