Я нахожусь в процессе разработки системы, которая подключается к одному или нескольким потокам потоков данных и выполняет некоторый анализ данных, а не инициирует события на основе результата. В типичной многопоточной настройке производитель / потребитель у меня будет несколько потоков производителей, помещающих данные в очередь, и несколько потоков потребителей, читающих данные, и потребители интересуются только самой последней точкой данных плюс n числом точек. Потоки производителя должны будут блокироваться, если медленный потребитель не может идти в ногу, и, конечно, потоки потребителя будут блокироваться, когда нет необработанных обновлений. Использование типичной параллельной очереди с блокировкой чтения / записи будет хорошо работать, но скорость поступления данных может быть огромной, поэтому я хотел уменьшить накладные расходы на блокировку, особенно блокировки записи для производителей. Я думаю, что мне нужен кольцевой буфер без блокировки.
Теперь два вопроса:
Является ли круговой буфер без блокировки ответом?
Если да, то, прежде чем я сделаю свою собственную, знаете ли вы какую-либо публичную реализацию, которая будет соответствовать моим потребностям?
Любые указатели в реализации циклического буфера без блокировки всегда приветствуются.
Кстати, делать это на C ++ в Linux.
Дополнительная информация:
Время отклика очень важно для моей системы. В идеале потребительские потоки захотят, чтобы обновления появлялись как можно скорее, потому что дополнительная задержка в 1 миллисекунду может сделать систему бесполезной или стоить намного меньше.
Идея дизайна, к которой я склоняюсь, - это циклический буфер без полузакрытия, в котором поток производителя помещает данные в буфер настолько быстро, насколько это возможно, давайте назовем заголовок буфера A без блокировки, если буфер не full, когда A встречает конец буфера Z. Каждый из потоков-потребителей будет содержать два указателя на кольцевой буфер, P и P n , где P - локальная головка буфера потока, а P n - это n-ый элемент после P. Каждый потребительский поток будет продвигать свои P и P n , как только он завершит обработку текущего P, а указатель конца буфера Z продвигается с самым медленным P n . , Когда P догоняет A, что означает, что больше нет новых обновлений для обработки, потребитель вращается и действительно занят, ожидая, пока A снова продвинется. Если потребительский поток вращается слишком долго, его можно перевести в спящий режим и ждать переменную условия, но я согласен с тем, что потребитель принимает цикл ЦП в ожидании обновления, потому что это не увеличивает мою задержку (у меня будет больше ядер ЦП чем темы). Представьте, что у вас есть круговая дорожка, и производитель работает перед группой потребителей, ключ в том, чтобы настроить систему так, чтобы производитель, как правило, работал на несколько шагов впереди потребителей, и большинство из этих операций могут быть сделано с использованием техники без блокировки. Я понимаю, что правильно понять детали реализации нелегко ... хорошо, очень сложно, поэтому я хочу учиться на чужих ошибках, прежде чем делать несколько своих.