Как правило, контейнеры STL могут быть доступны из нескольких потоков, если все потоки либо:
Вы не можете push_back
(или erase
, insert
и т. д.) из одного потока и читать из другогонить.Предположим, что вы пытаетесь получить доступ к элементу в потоке 1, в то время как push_back
в потоке 2 находится в середине перераспределения памяти вектора.Это может привести к сбою приложения, может вернуть мусор (или может сработать, если вам повезет).
Второй пункт относится к таким ситуациям:
std::vector<std::atomic_int> elements;
// Thread 1:
elements[10].store(5);
// Thread 2:
int v = elements[10].load();
В этом случаевы одновременно читаете и пишете атомарную переменную, но сам вектор не изменяется - только его элемент:
Редактировать: использование thread_safe::map
ничего не меняет в вас 'повторный случай.В то время как изменение карты в порядке, изменение ее элементов - нет.Помещение std::vector
в поточно-ориентированную коллекцию автоматически не делает ее также потоко-безопасной.