Могу ли я контролировать boost :: lockfree :: spsc_queue из третьего потока? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть один поток, производящий данные на boost::lockfree::spsc_queue, и один поток, потребляющий данные.Могу ли я иметь третий поток, отслеживающий очередь, используя read_available или write_available?Я не заинтересован в точном подсчете, но я хотел бы знать, неуклонно ли растет очередь, поскольку это означает, что потребитель не поспевает.Документы утверждают, что read_available:

Потоково-безопасный и без ожидания, должен вызываться только из потока потребителя

(https://www.boost.org/doc/libs/1_68_0/doc/html/boost/lockfree/spsc_queue.html)

Что произойдет, если третий поток попытается вызвать read_available? Если он просто получит неточный счет, это нормально. Если он может получить случайные числа или каким-то образом сломать что-то, то я думаю, что я сохранюсчитать с помощью std::atomic<int>.

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете попросить поток чтения периодически проверять размер очереди (например, каждые 1000 элементов) и публиковать std::atomic<int> qsize (с хранилищем mo_relaxed), которое может прочитать 3-й поток.

Используйте неатомарный счетчик, который закрыт для читателя.Читатель уменьшает его и сбрасывает до 1000+ публикует, когда он достигает нуля.Храните его в строке кэша, к которой писатель не прикасается, так что никакой дополнительной конкуренции вообще не возникает, за исключением каждого 1000-го элемента, который вы делаете в хранилище, для которого требуется RFO, прежде чем оно сможет передать значение в строку кэша.Но это хранилище только для записи, а не RMW, поэтому буфер хранилища может скрыть задержку.(За исключением x86, где следующий атомарный RMW всегда является полным барьером, поэтому ему придется ждать, пока это хранилище будет зафиксировано. Но это только каждые 1000 операций удаления очереди, поэтому он едва замедлит работу считывателя.)

Имея std::atomic<int>, что и читатель, и писатель атомарно inc / dec заставят их конкурировать друг с другом больше, чем очередь SPSC.Не так плохо, как борьба за блокировку, но я ожидаю, что это будет намного хуже, чем я предлагал.


Детали того, что происходит, могут зависеть от сгенерированного компилятором asm дляцелевая машина, и какое изменение порядка выполнения она может сделать.Я не знаю, но если в документах говорится, что это не поддерживается, вам придется исследовать или экспериментировать, если вы хотите рисковать.

Предположительно, звоните read_available(), когда читатель находится в середине.отказ от элемента по какой-то причине небезопасен.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...