aboutsummaryrefslogtreecommitdiff
path: root/docs/code/locks/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'docs/code/locks/main.c')
-rw-r--r--docs/code/locks/main.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/docs/code/locks/main.c b/docs/code/locks/main.c
new file mode 100644
index 00000000..2b1f8ca7
--- /dev/null
+++ b/docs/code/locks/main.c
@@ -0,0 +1,57 @@
+#include <stdio.h>
+#include <uv.h>
+
+uv_barrier_t blocker;
+uv_rwlock_t numlock;
+int shared_num;
+
+void reader(void *n)
+{
+ int num = *(int *)n;
+ int i;
+ for (i = 0; i < 20; i++) {
+ uv_rwlock_rdlock(&numlock);
+ printf("Reader %d: acquired lock\n", num);
+ printf("Reader %d: shared num = %d\n", num, shared_num);
+ uv_rwlock_rdunlock(&numlock);
+ printf("Reader %d: released lock\n", num);
+ }
+ uv_barrier_wait(&blocker);
+}
+
+void writer(void *n)
+{
+ int num = *(int *)n;
+ int i;
+ for (i = 0; i < 20; i++) {
+ uv_rwlock_wrlock(&numlock);
+ printf("Writer %d: acquired lock\n", num);
+ shared_num++;
+ printf("Writer %d: incremented shared num = %d\n", num, shared_num);
+ uv_rwlock_wrunlock(&numlock);
+ printf("Writer %d: released lock\n", num);
+ }
+ uv_barrier_wait(&blocker);
+}
+
+int main()
+{
+ uv_barrier_init(&blocker, 4);
+
+ shared_num = 0;
+ uv_rwlock_init(&numlock);
+
+ uv_thread_t threads[3];
+
+ int thread_nums[] = {1, 2, 1};
+ uv_thread_create(&threads[0], reader, &thread_nums[0]);
+ uv_thread_create(&threads[1], reader, &thread_nums[1]);
+
+ uv_thread_create(&threads[2], writer, &thread_nums[2]);
+
+ uv_barrier_wait(&blocker);
+ uv_barrier_destroy(&blocker);
+
+ uv_rwlock_destroy(&numlock);
+ return 0;
+}