From 0e2552ac5554e69d04bad03d19794b8d8eeaed76 Mon Sep 17 00:00:00 2001 From: Remzi Arpaci-Dusseau Date: Tue, 30 Apr 2019 09:57:31 -0500 Subject: [PATCH] no lock while signalling --- threads-cv/Makefile | 1 + threads-cv/join_no_lock.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 threads-cv/join_no_lock.c diff --git a/threads-cv/Makefile b/threads-cv/Makefile index b83ce38..6b5378b 100644 --- a/threads-cv/Makefile +++ b/threads-cv/Makefile @@ -3,6 +3,7 @@ CFLAGS := -Wall -Werror -I../include SRCS := join.c \ join_spin.c \ + join_no_lock.c \ join_modular.c OBJS := ${SRCS:c=o} diff --git a/threads-cv/join_no_lock.c b/threads-cv/join_no_lock.c new file mode 100644 index 0000000..2272db7 --- /dev/null +++ b/threads-cv/join_no_lock.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include "common.h" +#include "common_threads.h" + +pthread_cond_t c = PTHREAD_COND_INITIALIZER; +pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; +int done = 0; + +void *child(void *arg) { + printf("child: begin\n"); + sleep(1); + done = 1; + printf("child: signal\n"); + Cond_signal(&c); + return NULL; +} +int main(int argc, char *argv[]) { + pthread_t p; + printf("parent: begin\n"); + Pthread_create(&p, NULL, child, NULL); + Mutex_lock(&m); + printf("parent: check condition\n"); + while (done == 0) { + sleep(2); + printf("parent: wait to be signalled...\n"); + Cond_wait(&c, &m); + } + Mutex_unlock(&m); + printf("parent: end\n"); + return 0; +} +