Image

Imagecaracrist wrote in Imageru_cpp

ThreadSafe rotating buffer

Есть нужда сделать буфер для сброса в него элементов с нескольких тредов, и при этом не хочется тратить время на ожидания вообще.
Система такая:

есть операция, определим её, например, так:
template<class DataT = PVOID, class ObjectT = PVOID>
class TransactOperation
{
  DataT data;
  void operator () (ObjectT obj);
.... constructors...
}

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

DropOperation2Buffer();
if (TryLock())
{
ApplyOperationsStoredInBuffer();
Unlock();
}

Сдесь упущена обработка ошибки, не в этом суть. Для имплементации такой системы необходим Буфер способный принимать данные одновременно с нескольких тредов тогда, как с него cчитает ещё один. И всё это без каких либо глобальных локов способствующих ожиданиям, иначе это просто перенос проблемы, а не решение.

C этой целью я накатал вот это
Если вам известны более эффективные или надёжные инструменты, был бы рад ознакомиться. Да и в моём не 100% нет багов, хотя я их и не вижу.