функции размера и безопасность потоков в C ++ - PullRequest
6 голосов
/ 26 января 2012

Интересно, являются ли функции размера (размер, длина или что-то еще) потокобезопасными? Как я понимаю, они обычно просто возвращают какого-то члена частного размера. Я действительно сомневаюсь, что они делают какие-либо расчеты. Все они помечены как const, но они потокобезопасны? например std :: list :: size ?

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

Ответы [ 2 ]

6 голосов
/ 26 января 2012

Да, он должен быть защищен замком.Допустим, что std::list::size вашей реализации является 32-битным значением, но на вашей платформе 32-битные операции чтения не являются атомарными, они выполняют 2 16-битных операции чтения.В этом случае второй поток может прервать первое, которое считывало размер после того, как произошло первое чтение, обновить переменную размера, а затем, когда произойдет второе 16-разрядное чтение, вы можете получить реальное испорченное значение размера.

4 голосов
/ 26 января 2012

Нет, они не поточнобезопасны.Стандартные контейнеры просто не являются поточно-ориентированными, точка.

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

Другими словами, если вы отделяете все операции, которые изменяют контейнер, от операций, которые этого не делают, тогда, пока вы немутируя, вы можете безопасно позвонить size() из нескольких потоков.

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