2

我正在尝试使用 gcc 和 c++(前 c++11 和后)了解本地静态的行为。很多时候,在一个成员函数中,我发现自己在做这样的事情:

struct Foo
{
    void foo() 
    {
        static const bool bar = someFunc();
        //etc
    }
};

例如在someFunc()哪里getenv("SOME_ENV_VAR")。在上面的代码中,管理规则是什么bar?我相信,但没有参考,gcc 将编译一个同步机制(不确定是什么)来保护上述本地静态免受多个线程的影响。如果不再是,事情会如何变化const?或者如果我们让它成为本地线程__thread?如果foo()不是成员函数?

4

1 回答 1

2

规则实际上是由 C++ std 而不是 gcc 定义的: http: //cpp0x.centaur.ath.cx/stmt.dcl.html

我想说的是:

  • gcc 将保护初始化但不保护静态的使用;变量在第一次进入块时被初始化
  • const 不影响它,只要是静态存储
  • __thread vars 使用它们自己的初始化进行初始化,并且不受任何额外锁的保护(如 jmetcalfe 注释中所指出的)
  • static 应该在块范围内,所以任何块都可以,即使只是 {} 对。
  • (作者 Aurelien,见评论) someFunc 只会被调用一次

还有其他问题,例如从递归重新进入并且不允许死锁,所有这些都在上面的链接中进行了描述。此外,C++ 03 和 11 std 版本在这个主题上有些不同。

引用:

如果在变量初始化时控制同时进入声明,则并发执行将等待初始化完成

6.7.4 美元,C++11

which means that it is thread-safe - but only in the new standard. Anyway in gcc this is controlled by -f[no-]threadsafe-statics option.

I'm also interested in the downvote, I mean, if you think the link is wrong it would be nice to tell why, so that me and others know.

于 2013-02-13T19:26:15.960 回答