在示例代码中
void foo()
{
static Bar b;
...
}用编译的GCC能保证b会以线程安全的方式创建和初始化吗?
在gcc的手册页中,找到了-fno-threadsafe-statics命令行选项:
不会发出额外的代码来使用C++ ABI中指定的例程进行本地静态的线程安全初始化。您可以使用此选项在不需要是线程安全的代码中略微减小代码大小。
pthread_mutex_lock/unlock?发布于 2009-08-13 09:22:16
statics的initialization为thread-safe.static的线程安全初始化是非常重要的。如果您通常需要对本地static进行线程安全访问,那么您将需要自己添加适当的保护。发布于 2009-10-03 18:03:11
我们有严重的问题与锁定代码生成的GCC 3.4,以保护本地静态初始化。该版本使用全局共享互斥来保护所有和任何静态初始化,这会导致代码中的死锁。我们从一个函数的结果初始化了一个局部静态变量,该函数启动了另一个线程,该线程创建了一个局部静态变量。伪码:
voif f()
{
static int someValue = complexFunction();
...
}
int complexFunction()
{
start_thread( threadFunc() );
wait_for_some_input_from_new_thread();
return input_from_new_thread;
}
void threadFunc()
{
static SomeClass s();
...
}唯一的解决办法就是禁用了gcc的这个功能。如果你需要你的代码是可移植的,就像我们做的那样,你无论如何都不能依赖于特定的gcc版本中添加的线程安全功能。假设C++0x添加了线程安全的局部静态,在此之前,这是非标准的魔术,使您的代码不可移植,所以我建议您不要这么做。如果您决定使用它,我建议您通过编写一个示例应用程序来验证您的gcc版本没有为此目的使用单个全局互斥锁。(线程安全的困难可以从连gcc都做不到的事实中看出来)
发布于 2009-08-13 09:43:56
这并不是直接回答你的问题(Charles already did that),但我认为是时候再次在this article上发布一个链接了。它揭示了全局变量的初始化,并且应该被试图在多线程环境中使用static变量的每个人阅读和理解。
https://stackoverflow.com/questions/1270927
复制相似问题