Несколько производителей Одна очередь для потребителей - PullRequest
4 голосов
/ 28 апреля 2010

Я новичок в многопоточности и разработал программу, которая получает данные от двух микроконтроллеров, измеряющих различные температуры (окружающая среда и вода), и выводит данные на экран. Прямо сейчас программа однопоточна, и ее производительность отстой БОЛЬШОЙ.

Я получаю базовые подходы к проектированию с многопоточностью, но недостаточно хорошо, чтобы создать поток для выполнения задачи, но я не получаю, как заставить потоки выполнять отдельную задачу и помещать данные в общий пул данных. Я подумал, что мне нужно создать очередь с одним потребителем и несколькими производителями (хотел бы использовать std :: queue). Я видел некоторый код в документах с многопоточностью gtkmm, которые показывают одну очередь Con / Pro, и они блокировали бы объект очереди, производя данные и сообщая спящему потоку, что он закончен, тогда производитель будет спать. Для того, что мне нужно, мне нужно будет спать поток, возникнут ли конфликты данных, если я не сплю ни с одним из потоков, и будет ли спящий поток вызывать значительную задержку данных (мне нужно, чтобы данные в реальном времени отображались 30 кадров в сек)

Как бы я занялся кодированием такой очереди с использованием библиотеки gtkmm / glibmm.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010

Вот предложение:
1. Иметь два потока, которые отвечают за получение данных и размещение в буфере. Каждый поток имеет свой собственный (круговой) буфер.
2. Будет третий поток, который отвечает за получение данных из буферов и отображение на экране.
3. Поток экрана отправляет сообщения потокам данных, запрашивая некоторые данные, затем отображает данные. Эти сообщения помогают синхронизировать выполнение и избежать взаимных блокировок.
4. Ни один из потоков не должен «ждать одного или нескольких объектов», а опрашивать события.

Подумайте об этом сценарии, используя людей. Один человек передает показания температуры воды. Другой человек, доставляющий показания температуры окружающей среды. Третий человек получает или запрашивает данные и отображает данные (на белой доске). Цель состоит в том, чтобы все работали с максимальной эффективностью без столкновений.

2 голосов
/ 28 апреля 2010

Если вы ищете реализацию без блокировки, вы не найдете ее. Когда структуры данных записываются, что-то должно препятствовать двум потокам одновременно обновлять структуру данных и портить ее.

Есть ли причина, по которой вы не можете собрать каждый поток самостоятельно, со своей собственной структурой, а затем объединить результаты в конце?

...