The dining philosophers problem illustrates non-composability of low level synchronisaton primitives like semaphore. It is a modification of a problem posed by Edsger Djikstra
How to run
g++ dining_philosophers_problem.cpp -o output -pthread && ./output