Лучший шаблон, который я могу придумать, - это использовать какую-то очередь для передачи сообщений в пул потоков.Эти сообщения могут содержать функции для запуска, а также некоторые управляющие сообщения для отключения пула потоков.Как вы уже догадались, очередь должна быть поточно-ориентированной.
Простой подход к очереди - использовать массив фиксированного размера, который вы превращаете в кольцевой буфер.Массив будет иметь Mutex для его блокировки при доступе к массиву и переменную условия для пробуждения потока пула потоков.
При помещении элемента в очередь мы блокируем мьютекс, добавляем в очередь и затемсигнализируйте пулу потоков с помощью переменной условия.
Каждый запущенный поток в пуле потоков будет начинать жизнь, блокируя мьютекс и ожидая выполнения условия (которое автоматически разблокирует мьютекс).При пробуждении он удалит элемент из очереди, а затем разблокирует мьютекс.Это теперь бесплатно делать свои вещи.По окончании он переходит в спящий режим до повторной подачи сигнала.
Как общий совет, избегайте разделения памяти между потоками, поскольку это либо приводит к условиям гонки (если доступ не защищен), либо приводит к блокировке (если доступ заблокирован),Также избегайте блокировки мьютекса при выполнении любых длительных операций, таких как вызов новых (malloc), удаление (свободных) или любых системных вызовов.