考虑以下示例(为简单起见,省略cout
上的锁定保护)。
#include <future>
#include <iostream>
#include <thread>
using namespace std;
struct C
{
C() { cout << "C constructor\n";}
~C() { cout << "C destructor\n";}
};
thread_local C foo;
int main()
{
int select;
cin >> select;
future<void> f[10];
for ( int i = 0;i < 10; ++i)
f[i] = async( launch::async,[&](){ if (select) foo; } );
return 0;
}
在clang和gcc上,如果用户写入&#39; 0&#39;,则该程序不输出任何内容,而如果用户输入非零数字,则打印Constructor
/ Destructor
10次。
另外clang抱怨明显的非使用表达结果。
由于thread_local
存储生命周期应该跨越整个线程的生命周期,我期望在每个线程中初始化foo
变量,而不管用户输入如何。
我可能想要一个thread-local
变量,其唯一目的是在构造函数中产生副作用,标准是否要求thread_local
对象在首次使用时初始化?
答案 0 :(得分:18)
该标准允许此行为,但它并不能保证。从3.7.2 / 2 [basic.stc.thread]:
具有线程存储持续时间的变量应在之前初始化 它的第一次使用(3.2),如果构造,将被销毁 线程退出。
也可能在某些其他时间(例如在程序启动时)构建对象,在第一次使用之前#34;&#34;意味着&#34;任何时候,只要它在&#34;之前。而不是&#34;就在#34;。
之前