首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GCC中,函数静态变量是线程安全的吗?

在GCC中,函数静态变量是线程安全的吗?
EN

Stack Overflow用户
提问于 2009-08-13 09:16:47
回答 4查看 28.3K关注 0票数 60

在示例代码中

代码语言:javascript
复制
void foo()
{
  static Bar b;
  ...
}

编译的GCC能保证b会以线程安全的方式创建和初始化吗?

在gcc的手册页中,找到了-fno-threadsafe-statics命令行选项:

不会发出额外的代码来使用C++ ABI中指定的例程进行本地静态的线程安全初始化。您可以使用此选项在不需要是线程安全的代码中略微减小代码大小。

  1. 这是不是意味着,对于GCC来说,本地statics默认是线程安全的?所以没有理由显式的保护,例如pthread_mutex_lock/unlock
  2. 如何编写可移植的代码-如何检查编译器是否会添加保护?还是更好地关闭GCC的这一功能?--
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-13 09:22:16

  1. 否,表示本地statics的initialization为thread-safe.
  2. You,一定要保持开启该功能。本地static的线程安全初始化是非常重要的。如果您通常需要对本地static进行线程安全访问,那么您将需要自己添加适当的保护。
票数 44
EN

Stack Overflow用户

发布于 2009-10-03 18:03:11

我们有严重的问题与锁定代码生成的GCC 3.4,以保护本地静态初始化。该版本使用全局共享互斥来保护所有和任何静态初始化,这会导致代码中的死锁。我们从一个函数的结果初始化了一个局部静态变量,该函数启动了另一个线程,该线程创建了一个局部静态变量。伪码:

代码语言:javascript
复制
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都做不到的事实中看出来)

票数 18
EN

Stack Overflow用户

发布于 2009-08-13 09:43:56

这并不是直接回答你的问题(Charles already did that),但我认为是时候再次在this article上发布一个链接了。它揭示了全局变量的初始化,并且应该被试图在多线程环境中使用static变量的每个人阅读和理解。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1270927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档