--- /dev/null
+
+/* Dining philosophers, using semaphores. From the Ben-Ari book. */
+
+#include <stdio.h>
+#include <assert.h>
+#include <pthread.h>
+#include <semaphore.h>
+
+#define N_PHILOSOPHERS 5
+
+sem_t room;
+sem_t forc[N_PHILOSOPHERS];
+pthread_t tid[N_PHILOSOPHERS];
+
+void eat ( int i )
+{
+ printf("%d -> begin eat\n", i);
+ i += 17;
+ i *= 10000;
+ while (i > 0) i--;
+ printf("%d -> end eat\n", i);
+}
+
+void think ( int i )
+{
+ printf("%d -> begin think\n", i);
+ i += 23;
+ i *= 9000;
+ while (i > 0) i--;
+ printf("%d -> end think\n", i);
+}
+
+void* philosopher ( void* vi )
+{
+ int i = (int)vi;
+ int res;
+ int rounds;
+ for (rounds = 0; rounds < 10; rounds++) {
+ think(i);
+ res = sem_wait(&room); assert(res == 0);
+ res = sem_wait(&forc[i]); assert(res == 0);
+ res = sem_wait(&forc[(i+1) % N_PHILOSOPHERS]); assert(res == 0);
+ eat(i);
+ res = sem_post(&forc[i]); assert(res == 0);
+ res = sem_post(&forc[(i+1) % N_PHILOSOPHERS]); assert(res == 0);
+ res = sem_post(&room); assert(res == 0);
+ }
+ return NULL;
+}
+
+int main ( void )
+{
+ int i, res;
+
+ res = sem_init(&room, 0, 4); assert(res == 0);
+ for (i = 0; i < N_PHILOSOPHERS; i++) {
+ res = sem_init ( &forc[i], 0, 1 );
+ assert(res == 0);
+ }
+
+ for (i = 0; i < N_PHILOSOPHERS; i++) {
+ res = pthread_create ( &tid[i], NULL, philosopher, (void*)i );
+ assert(res == 0);
+ }
+ for (i = 0; i < N_PHILOSOPHERS; i++) {
+ res = pthread_join ( tid[i], NULL );
+ assert(res == 0);
+ }
+ return 0;
+}