Fork/Join

Simple example of the fork/join (i.e., waiting for a child) problem using semaphores, found in join.c.

Run make to build the code; run join to test it. Fun!

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!

prompt> make
prompt> ./binary

Producer/Consumer

Code for the working producer/consumer solution from the text, found in producer_consumer.c.

Run make to build, and producer_consumer to test it. The program takes a few different arguments:

  • The number of buffers between the producer/consumer
  • The number of times a producer should produce something
  • The number of consumer threads
prompt> make
prompt> ./producer_consumer 1 1000 1

The output should print each produced item once, and show which consumer consumed each produced item.

Reader/Writer Locks

Code in rwlock.c. Build via make, run via rwlock.

Dining Philosophers

The dining philosophers example from the text is found herein, in a few different forms:

  • dining_philosophers.c: code with deadlock
  • dining_philosophers_print.c: code with deadlock, and some useful printing
  • dining_philosophers_no_deadlock.c: code without deadlock
  • dining_philosophers_no_deadlock_print.c: code without deadlock, and some useful printing

Run make to build all of them with the highly primitive Makefile.

Zemaphores

Code in zemaphore.c. We bet you can figure out the rest. This is just a small test of the Zemaphore with the fork/join problem.

Throttle

Bonus code that shows how semaphores can be used to throttle how many different threads run through a certain bit of code at a time. Code in throttle.c.