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