2015-07-18 5 views
1

У меня есть общая очередь (реализована с использованием обертки очереди singleton) и поток чтения и поток писем. У меня также есть механизм для информирования потока читателя, когда поток писателя добавляет элементы (enqueue) в очередь. Считывающий поток деактивирует только один элемент при его информировании. Есть ли необходимость в Read Write Lock в этом сценарии.Требуется ли блокировка отдельной очереди с отдельными потоками чтения и записи?

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

+0

Что, черт возьми, с синглтонами сегодня? – user4581301

+0

нужна более подробная информация, до сих пор я могу предложить «возможно» – Jasen

+0

Вам почти наверняка нужен замок. Но, как упоминает Jasen, более подробная информация (т. Е. Код) была бы хорошей, чтобы можно было дать более конкретные комментарии. –

ответ

1

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

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

+0

Почему downvote? Что-то не так с моим ответом? Или просто недостаточно подробно? – MikeMB

1

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