aboutsummaryrefslogtreecommitdiff
path: root/docs/code/locks/main.c
diff options
context:
space:
mode:
authorSaúl Ibarra Corretgé <saghul@gmail.com>2017-04-25 08:27:52 +0200
committerSaúl Ibarra Corretgé <saghul@gmail.com>2017-04-28 11:16:15 +0200
commitd59d6e6f22b4c11c37e34843d111a748df73bda2 (patch)
treef2a46fbfb3e308b3f474d086b122f4b591a78bcc /docs/code/locks/main.c
parent2ce5734d76a8bfbf01af4a4854edf1e3cc42e029 (diff)
downloadlibuv-d59d6e6f22b4c11c37e34843d111a748df73bda2.tar.gz
libuv-d59d6e6f22b4c11c37e34843d111a748df73bda2.zip
doc: add code samples from uvbook (unadapted)
PR-URL: https://github.com/libuv/libuv/pull/1246 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
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;
+}