diff --git a/threads-sema/Makefile b/threads-sema/Makefile index 8ab4f2b..071cf1f 100644 --- a/threads-sema/Makefile +++ b/threads-sema/Makefile @@ -6,6 +6,7 @@ SRCS := dining_philosophers_deadlock.c \ dining_philosophers_no_deadlock.c \ dining_philosophers_no_deadlock_print.c \ join.c \ + binary.c \ zemaphore.c OBJS := ${SRCS:c=o} diff --git a/threads-sema/README.md b/threads-sema/README.md index 6095a32..0fa6c3e 100644 --- a/threads-sema/README.md +++ b/threads-sema/README.md @@ -6,8 +6,23 @@ using semaphores, found in `join.c`. Run `make` to build the code; run `join` to test it. Fun! +```sh +prompt> make +prompt> ./join +``` +# Binary Semaphores (Locks) + +Simple example of semaphores as locks (binary semaphores). +Code in `binary.c`. + +Run `make` to build the code; run `binary` to test it. Fun! + +```sh +prompt> make +prompt> ./binary +``` # Dining Philosophers diff --git a/threads-sema/binary.c b/threads-sema/binary.c new file mode 100644 index 0000000..93df440 --- /dev/null +++ b/threads-sema/binary.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +#include "common.h" +#include "common_threads.h" + +sem_t mutex; +volatile int counter = 0; + +void *child(void *arg) { + int i; + for (i = 0; i < 10000000; i++) { + Sem_wait(&mutex); + counter++; + Sem_post(&mutex); + } + return NULL; +} + +int main(int argc, char *argv[]) { + Sem_init(&mutex, 1); + pthread_t c1, c2; + Pthread_create(&c1, NULL, child, NULL); + Pthread_create(&c2, NULL, child, NULL); + Pthread_join(c1, NULL); + Pthread_join(c2, NULL); + printf("result: %d\n", counter); + return 0; +} +