C ++ / CLI эффективный многопоточный кольцевой буфер - PullRequest
1 голос
/ 15 декабря 2009

У меня есть четыре потока в C ++ / CLI GUI, который я разрабатываю:

  1. Собирает необработанные данные
  2. Сам графический интерфейс
  3. Поток фоновой обработки, который берет куски необработанных данных и выдает полезную информацию
  4. Действует как контроллер, соединяющий три других потока

Я получил сборщик необработанных данных и отправил результаты на контроллер, но следующий шаг - сохранить все эти результаты, чтобы к ним имели доступ графический интерфейс и фоновый процессор.

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

Я охотился, но ни один из материалов, поставляемых CLI, не звучит так уж полезно, поэтому я подумываю о том, чтобы прокатиться самостоятельно. Общий кольцевой буфер, который позволяет блокировать запись для коллектора и блокировку чтения для графического интерфейса и процессора данных. Это позволит нескольким потокам читать данные до тех пор, пока эти разделы буфера не будут записаны.

Итак, мой вопрос: есть ли в библиотеках .net какие-то простые решения, которые могли бы достичь этого? Я сумасшедший из-за того, что решил прокатиться сам? Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 15 декабря 2009

Можно ли перефразировать проблему так:

  1. Коллектор собирает новую точку данных ...
  2. ... который он передает контроллеру.
  3. Контроллер запускает графический интерфейс «NewDataPointEvent» ...
  4. ... и сохраняет точку данных в массиве.
  5. Если массив заполнен (или иным образом готов к обработке), контроллер отправляет массив в процессор ...
  6. ... и запускает новый массив.

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

...