Я знаю, что контейнеры из стандартной библиотеки не являются потокобезопасными. При этом я думал, что контейнер, например тип std::list
, не может быть доступен более чем одним потоком одновременно (некоторые из них могут модифицировать контейнер). Но теперь кажется, что есть нечто большее, чем кажется на первый взгляд; что-то более тонкое, что-то не столь очевидное, ну, по крайней мере, для меня.стандартные контейнеры в качестве локальных переменных в многопоточном приложении
Для примера рассмотрим эту функцию, которая принимает первый аргумент по значению:
void log(std::string msg, severity s, /*...*/)
{
return; //no code!
}
Это поточно-?
Во-первых, кажется, что он является потокобезопасным, так как тело функции не обращается к обмениваемым ресурсам, следовательно, поточно-безопасным. С другой стороны, мне приходит в голову, что при вызове такой функции будет создан объект типа std::string
, который является первым аргументом, и я думаю, что построение этого объекта не является потокобезопасным, поскольку оно внутренне использует std::allocator
, который, я считаю, не является потокобезопасным. Следовательно, вызов такой функции также не является потокобезопасным. Но если это правильно, то что об этом:
void f()
{
std::string msg = "message"; //is it thread-safe? it doesn't seem so!
}
Я иду вправо? Можем ли мы использовать std::string
(или любой контейнер, который использует std::allocator
внутри) в многопоточной программе?
Я конкретно говорю о контейнерах как локальных переменных, а не об общих объектах.
Я искал google и нашел много подобных сомнений, без конкретного ответа. Я сталкиваюсь подобной проблемой, как его:
Пожалуйста, обратите внимание на C++ 03 и C++ 11, как.
Nawaz - знаете ли вы, о какой реализации C++ они говорят здесь: http://www.sgi.com/tech/stl/Allocators.html Указывает, что распределитель по умолчанию является потокобезопасным. – Sid
@Sid: Это не стандартная библиотека; они поддерживают множество вещей, которые stdlib не делает. – Nawaz
Хорошо, извините за отвлечение. – Sid