If I wanted my server to accept many concurrent connections, the common solution was to use threads, and soon I had created my fi rst multi-threaded TCP server. This server accessed a shared data structure, which needed to synchronize the access to all the client threads that had been spawned. Getting the synchronization fi ne-grained (to maximize resources and time) and right (to avoid deadloc…