Безопасен ли вызов size () для потока контейнера std? - PullRequest
3 голосов
/ 20 сентября 2019

У меня есть буфер, использующий контейнер списка std.

Рабочий толкает элементы на одной стороне, а другая нить - на другой.Оба этих потока используют мьютекс перед доступом к контейнеру.

Чтобы увидеть производительность, мне нужно запросить у контейнера его размер.Но запрос размера с использованием мьютекса кажется излишним, если не нужно.

Вопрос в том, нужно ли это?

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

Ответы [ 2 ]

6 голосов
/ 20 сентября 2019

Вопрос в том, нужно ли это?

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

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


В соответствии с вашими правками:

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

0 голосов
/ 20 сентября 2019

Краткий ответ: «да».

Чтобы определить необходимость взаимоисключения, необходимо взглянуть на спецификации «гонки данных» задействованных функций.В этом случае спецификации функций std::list push / pop говорят, что контейнер изменен .В то время как спецификация функции size гласит, что контейнер имеет доступ .

Как правило, всякий раз, когда некоторые данные доступны или изменяются более чем одним потокоми модифицируется хотя бы одним из потоков, тогда все доступ и модификации должны быть защищены взаимным исключением.

...