Смежный вопрос:
Является ли std :: vector потокобезопасным и параллельным по умолчанию? Почему или почему нет? .
Это потокобезопасно, потому что вы не изменяете размер вектора и не пытаетесь записать в одну и ту же ячейку памяти в разных потоках.
Кому будущее ответ этот ответ для тех, кто не углубляется в ссылку:
Это не потокобезопасно только , потому что они используют оператор []
. Это потокобезопасно, потому что каждый поток явно изменяет другое местоположение в памяти.
Если бы все потоки считывали одно и то же местоположение, используя []
, это было бы потокобезопасен.
Если все потоки записывают в одно и то же место, использование []
не помешает им связываться друг с другом.
Я думаю, что если бы это был рабочий код, по крайней мере, был бы вызван комментарий, объясняющий, почему это потокобезопасно. Не уверен ни в каком способе времени компиляции, чтобы кто-то не мог выстрелить себе в ногу, если он изменил эту функцию.
В пункте № 4 мы хотим сообщить будущим пользователям этот код:
- Нет, мы не охраняем этот стандартный контейнер библиотеки, хотя это должно быть вашей внутренней реакцией, и
- Да, мы проанализировали его, и это безопасно.
Самый простой способ - вставить комментарий, но есть поговорка:
Компилятор не читает комментарии и я тоже.
-Bjarne Страуструп
Я думаю, что какой-то [[attributes]]
должен быть способ сделать это? Хотя встроенные , похоже, не поддерживают какие-либо проверки безопасности потоков.
Clang обеспечивает анализ безопасности потоков :
Анализ все еще находится в активной разработке, но он достаточно зрел, чтобы его можно было использовать в промышленных условиях.
Предполагается, что вы реализуете другие функции, для которых требуется std::mutex
ответственный за std::vector
:
std::mutex _mu;
std::vector<int> _vec GUARDED_BY(_mu);
, тогда вы можете явно добавить атрибут NO_THREAD_SAFETY_ANALYSIS
, чтобы отключить проверку безопасности для этой указанной c функции. Я думаю, что лучше всего объединить это с комментарием:
// I know this doesn't look safe but it is as long as
// the caller always launches it with different values of `i`
void foo(int i, std::vector<int>& vec) NO_THREAD_SAFETY_ANALYSIS;
Использование GUARDED_BY
говорит мне, что в будущем вы думаете о безопасности потоков. Использование NO_THREAD_SAFETY_ANALYSIS
показывает, что вы определили, что эту функцию можно использовать, особенно если другие функции, которые изменяют ваш vector
, не отмечены NO_THREAD_SAFETY_ANALYSIS
.