我知道标准库中的容器不是线程安全的。我曾经认为一个容器,比如说 type 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
我专门将容器称为局部变量,而不是共享对象。
我搜索了谷歌,发现了许多类似的疑问,没有具体的答案。我面临与他类似的问题:
请同时考虑 C++03 和 C++11。