Нужно ли блокировать одну очередь с отдельными потоками чтения и записи?

У меня есть общая очередь (реализованная с использованием одноэлементной оболочки очереди), поток чтения и записи. У меня также есть механизм информирования потока чтения, когда поток записи добавляет элементы (очередь) в очередь. Поток читателя отключает только один элемент при получении сообщения. Есть ли необходимость блокировки чтения-записи в этом сценарии.

Так как писатель только ставит в очередь, а читатель отключает, я чувствую, что нет необходимости в блокировке, если читатель проверяет размер очереди при снятии очереди.

1

Решение

Так как писатель только завлекает, а читатель заворачивает, я чувствую, что в блокировке нет необходимости, если читатель проверяет размер очереди при снятии

Среди других проблем эта операция уже небезопасна, когда очередь модифицируется другим потоком. В c ++ любой несинхронизированный доступ к неатомарным разделяемым переменным (по крайней мере, одна из которых является записью) является гонкой данных и, следовательно, UB.

1

Другие решения

Я предполагаю, что вы имеете в виду stl :: queue и нет большинство операций над контейнерами stl не сохраняют потоки. Для обсуждения исключений см. Контейнеры C ++ 11 STL и безопасность потоков. STL предпочитает скорость над безопасностью (например, проверка диапазона для индексов массива и т. Д.), Предполагая, что разработчики будут осуществлять свои собственные проверки.

1

По вопросам рекламы [email protected]