Я знаю, что есть похожие вопросы, на которые уже дан ответ, но я задаю этот вопрос, поскольку они не дают точно то, что я хотел бы знать.
Это о синхронизации между потоками. Идея моего проекта заключается в том, что мы получаем данные с карты сбора данных, строим и анализируем данные во время сбора данных. Пока у меня есть только класс для сбора данных в одном потоке и класс для построения в другом потоке. Класс сбора данных хранит данные в глобальном круговом буфере, а класс построения копирует данные из глобального буфера и выполняет некоторые процессы для построения графика (уменьшение точки данных и т. Д.). Это то, что я называю проблемой (одного) производителя (одного) потребителя. Мне удалось выполнить эту часть, используя два семафора, которые отслеживают, сколько точек данных хранится в классе сбора и сколько используется классом построения.
Теперь я хотел бы представить другой класс в другом потоке, который анализирует данные. Тогда у меня будет один производитель и два потребителя. Я хотел бы наложить следующие условия:
- Два считывателя используют один и тот же набор данных. Т.е. каждый произведенный предмет
должен использоваться обоими читателями,
вместо одного из них.
- Когда буфер заполняется, класс сбора данных перезаписывается
глобальный буфер. Когда
считыватель теряет данные из-за
перезапись буфера
класс сбора данных, это должно
быть обнаружены и, в идеале, храниться в
журнал (например, какая часть
данные пропущены читателем (ями).
- Расчет анализа
класс может быть интенсивным. За это,
Мне может понадобиться больший буфер данных в
класс анализа.
То, как я справился с первой частью (один производитель и один потребитель), похоже, не распространяется на случай второй части (один производитель и два потребителя). Мне интересно, как мне поступить.
Я использую C ++ с Qt для многопоточности, так как я использую Qt для GUI. Но решение не обязательно должно быть с Qt. Тем не менее, если это возможно, примеры кодов или псевдокодов будут высоко оценены. Я нашел аналогичную тему для моей проблемы здесь ). Предлагается использовать boost :: interprocess. Однако, поскольку я никогда раньше не использовал библиотеку Boost и, хотя я читал документы о boost :: interprocess, она выглядит слишком сложной, чтобы понять это сам.
Большое спасибо!
Daisuke