Задание 12: многопоточный конвейер

Реализовать многопотоковую версию сервера с разделяемой памятью из предыдущих заданий для параллельной обработки запросов от клиентов (каждый запрос обрабатывается в отдельном потоке). Файл должен быть достаточно большим, чтобы каждой отдельный запрос выполнялся заметно долго. Файл, несмотря на то, что он является общим ресурсом для всех потоков, не следует блокировать. Доступ к разделяемой памяти, естественно, должен быть согласованным для серверных потоков и для клиентский процессов.

Указание: продвинутые студенты могут реализовать в основном потоке сервера небольшой диспетчер для отслеживания активности потоков.