相关疑难解决方法(0)

C++ 11中的局部静态变量初始化是否是线程安全的?

我知道这是一个经常被问到的问题,但由于有很多变种,我想重新陈述它,并希望有一个反映当前状态的答案.就像是

Logger& g_logger() {
    static Logger lg;
    return lg;
}
Run Code Online (Sandbox Code Playgroud)

变量lg的构造函数是否保证只运行一次?

我从以前的答案中知道,在C++ 03中,这不是; 在C++ 0x草案中,这是强制执行的.但我想要一个更明确的答案

  1. 在C++ 11标准(非草稿)中,线程安全的初始化行为是否已完成?
  2. 如果以上是肯定的,那么在当前最新版本的热门编译器中,即gcc 4.7,vc 2011和clang 3.0,它们是否正确实施?

c++ thread-safety c++11

198
推荐指数
2
解决办法
6万
查看次数

何时分配/初始化函数级静态变量?

我非常有信心在程序启动时分配(并初始化,如果适用)全局声明的变量.

int globalgarbage;
unsigned int anumber = 42;
Run Code Online (Sandbox Code Playgroud)

但是在函数中定义的静态的呢?

void doSomething()
{
  static bool globalish = true;
  // ...
}
Run Code Online (Sandbox Code Playgroud)

globalish分配的空间是什么时候?我猜测程序什么时候开始.但是它也被初始化了吗?或者它doSomething()是在第一次调用时初始化的?

c++ variables

82
推荐指数
5
解决办法
6万
查看次数

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

在示例代码中

void foo()
{
  static Bar b;
  ...
}
Run Code Online (Sandbox Code Playgroud)

使用GCC编译是否可以保证b以线程安全的方式创建和初始化?

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

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

  1. 这是否意味着,默认情况下,GCC的本地静态是线程安全的?所以没有理由明确保护,例如pthread_mutex_lock/unlock

  2. 如何编写可移植代码 - 如何检查编译器是否会添加其防护?或者关闭GCC的这个功能是否更好?

c++ static gcc initialization thread-safety

58
推荐指数
4
解决办法
3万
查看次数

标签 统计

c++ ×3

thread-safety ×2

c++11 ×1

gcc ×1

initialization ×1

static ×1

variables ×1