Продолжаю мучить сообщество своими хлупыми вопросами на похожие темы ) Вернуть результат thread в С++ без мутексов?
Необходимо запараллелить 3 потока
- получение данных (чтение с камеры)
- пересжатие и запись в сеть (декодировани в основном и кодирование в дополнительном уже выполняется кажется эффективно в 2х потоках на Си через 2 семафора, по очереди отпускающие поток друг друга через условную «очередь» из массива 2х указателей, в которой меняется только индекс)
- запись данных из п.1 на диск
В однопоточной реализации вариантов 1+3 или 1+2 все работает вроде эффективно, задача 1 выполняется менее 30 мс, 2 - от 30 до 100мс, 3 - в районе 50мс
Теоретически конечно потоки 2 и 3 должны только читать память из потока 1 (хотя что происходит внутри сторонней либы потока 2 я не знаю) и теоретически можно было бы обойтись одним семафором для основного потока 1, НО поток 3 должен читать и записывать данные (кадры) на диск через равные промежутки времени, а поток 2 читать все данные (кадры) без задержек.
В предыдущей теме меня пнули в сторону атомиков, из чтения всяких хабров я понял следующее - работающие только с памятью атомик существенно быстрее, чем системный вызов мьютекса/семафора, однако как я понял в этом случае предлагается ждать в бесконечном цикле изменение атомика - но ведь это загрузит поток на 100%, а у меня только поток 2 грузит оставшиеся 300% на 4х ядрах
При этом как бы еще решить проблему конкуренции за ПОСЛЕДНИЙ кадр, все что раньше попало в очередь уже не имеет значения и просто считаю дропнутым
ЗЫ. Извините за многобукав! ЗЫ1. хотелось бы понять направление в которое двигаться.