Practice managing concurrency through mutexes and semaphores tackling the dining philosophers problem