Are function static variables thread-safe in GCC?

2019-06-18 10:31发布

在该示例中代码

void foo()
{
  static Bar b;
  ...
}

使用GCC编译时能够保证所有的b将被创建并在一个线程安全的方式初始化?

在gcc的手册页,发现了-fno线程安全的,静态的命令行选项:

不要发出额外的代码使用在C ++ ABI本地静态的线程安全初始化指定的程序。 您可以使用此选项可减少略有代码并不需要是线程安全的代码大小。

  1. 这是否意味着,当地静态是线程安全的默认使用GCC? 因此,没有理由把守着明确例如使用pthread_mutex_lock/unlock

  2. 如何编写可移植代码 - 如何检查,如果编译器将增加其防护? 抑或是最好关闭GCC的这个功能吗?

Answer 1:

  1. 不,这意味着本地初始化 static s是线程安全的。

  2. 你一定要离开启用此功能。 本地线程安全初始化static S是非常重要的。 如果您需要到当地一般线程安全的访问static当时的你需要自己添加相应的警卫。



Answer 2:

我们不得不与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无法得到它的权利)



Answer 3:

这是不是真的回答你的问题,立竿见影( 查尔斯已经这样做 ),但我认为它的时间来发布链接到这篇文章一次。 它轻视全局的初始化光,应阅读和大家尝试使用理解static在多线程环境变量。



Answer 4:

我认为关键的一句是

...本地静态的线程安全的初始化

我看这是意味着它仅仅是将在一个线程安全的方式进行静态初始化。 一般使用静态的不会是线程安全的。



文章来源: Are function static variables thread-safe in GCC?