Я некоторое время работал над многопоточным приложением C (Linux) - видеомагнитофоном, в котором есть потоки для захвата, кодирования, мультиплексирования и записи аудио и видео.
Я начал собирать его в режиме ad-hoc, используя операции pthread, но сейчас я пытаюсь расширить его для поддержки большего количества состояний и рефакторинга фрагментов кода, которые появляются как дубликаты для блокировки, установки флагов и сигнализации состояние и т. д.
Пока что я придумал что-то вроде этого:
- У каждого потока должна быть блокировка мьютекса и два условия - одно для пробуждения потока, а другое для сигнализации о том, что поток завершил выполнение некоторой работы, которую может ожидать другой поток.
- Очереди данных «принадлежат» определенному потоку и защищены с помощью блокировки этого потока.
- Каждый поток нуждается в понятии «активные» и «неактивные» состояния и способности перемещаться между ними и сигналом, когда все готово.
Я планирую хранить общие элементы в структуре и иметь массив тех структур, которые я могу перебрать для запуска, проверки и остановки всех потоков.
Поскольку это превращается в более общую модель поддержки потоков, я подумал, что, вероятно, заново изобретаю колесо, поэтому я спрошу здесь, есть ли какие-то хорошие известные шаблоны, которые я должен применить.