1

考虑以下代码:

#include <iostream>
#include <thread>

using std::cout;
using std::thread;

thread_local int a;

void foo()
{
    a = a + 1;
    cout  << a << "\n";
}

void bar()
{
    cout << a << "\n";
}

void baz()
{
    cout << "Something\n";
}

int main()
{
    thread first(foo);
    thread second(bar);
    thread third(baz);
    second.join();
    first.join();
    third.join();
    cout << a;
}

演示

由于a有线程存储持续时间,我们至少有三个不同的对象,用 a 和 used in和first线程表示。我们不使用inside 。是否有可以在第三个中使用的零初始化?我问这个问题是因为我在标准中找不到任何关于此的内容:secondmainathirda

作为线程执行的结果,具有线程存储持续时间的非局部变量被初始化。

是否定义了实现?

4

1 回答 1

2

N3337, 3.7.2.2

具有线程存储持续时间的变量应在其第一次使用 odr (3.2) 之前进行初始化,并且如果已构建,则应在线程退出时销毁。

3.2.2 太长,无法在此处复制,但本质上,如果它没有出现在执行的代码中,它就不能被“odr-used”。所以它不是(必然)用某些东西初始化的。

于 2014-07-11T15:51:36.323 回答