18
Май
2017

модель производитель – потребитель в контексте потоков

Есть два потока, один из которых выступает производителем данных, а второй - их потребителем. Так же есть общий пул данных, например, массив структур типа :

struct D{
char fl_busy;
char data[256];
}; 

Поток-производитель выполняет только следующие 3 действия :

  1. просматривает пул на предмет наличия пустого элемента (перебирает элементы до первого, в котором fl_busy = 0);
  2. если такой элемент найден, помечает его занятым (fl_busy = 1), заполняет оставшуюся часть структуры data;
  3. передает указатель на только что заполненный элемент пула потоку-потребителю (например, добавляет указатель в очередь, которую мониторит поток-потребитель).

Поток-потребитель, в свою очередь, выполняет только свои 3 действия :

  1. ожидает, когда в очереди появится указатель на элемент пула, и изымает его из очереди;
  2. получив указатель, как-то обрабатывает данные data в структуре (модифицирует, копирует куда-то);
  3. помечает данные элемент пула свободным (fl_busy = 0);

Вопросы:

  1. Какие вообще механизмы лучше использовать в подобных задачах, чтобы не снижать производительность, но при этом добиться, чтобы значение флагов в элементах пула было видимым и актуальным в обоих потоках и гарантировать правильную последовательность действий в потоках? Volatile в каждом элементе пула использовать совсем не хочется из-за производительности, да и все проблемы он, вероятно, не решит. Кажется, что тут имеет смысл использовать барьеры памяти, но я пока плохо с ними освоилась, и мне не помешал бы пример.
  2. Нужны ли тут атомарные функции и объявление fl_busy как atomic, с учетом что флаг всего байт?

Источник: https://ru.stackoverflow.com/questions/667699/%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C-%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%B8%D1%82%D0%B5%D0%BB%D1%8C-%D0%B2-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B5-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%B2

Share

Тебе может это понравится...