考虑以下示例(为简单起见,对
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上,如果用户写入'0',此程序不会输出任何内容,而如果用户输入非零数字,则会打印Constructor
/Destructor
10次。
此外,clang会抱怨一个明显没有使用的表达式结果。
由于thread_local
存储寿命应该跨越整个线程的生命周期,我期望foo
变量在每个线程中都被初始化,无论用户输入什么。
我可能想要一个thread-local
变量,只是为了在构造函数中产生副作用,那么标准是否要求thread_local
对象在第一次使用时被初始化?
CTRL+F
技能非常有限 :) - sbabbithread_local
是应用于块作用域变量的唯一存储类说明符,则隐含使用static
,所以你是正确的)。然而,问题中的foo
是在全局(全局命名空间)作用域中声明的,并且没有隐含的静态属性。 - kwsp