为什么线程返回时thread_local变量没有被销毁?

问题描述 投票:0回答:1

为了更好地理解这个问题,这里是代码:

// code 1
#include <iostream>
#include <thread>

struct tls_test {
    tls_test()
    { std::cout << "tls_test ctor\n"; }

    ~tls_test()
    { std::cout << "tls_test dtor\n"; }

    void print() const
    { std::cout << "tls_test print\n"; }
};

thread_local tls_test t;

void thread_1()
{
    std::cout << "thread_1 started\n";
    t.print();
    std::cout << "thread_1 return\n";
}

int main()
{
    std::thread trd{ thread_1 };
    trd.join();
    std::cout << "main return\n";
}

我正在使用 TDM-GCC 和 Windows 10 来测试这个程序。这是输出:

thread_1 started
tls_test ctor
tls_test print
thread_1 return
main return

根据basic.stc.thread,构造变量t,并在线程退出时销毁。所以我认为即使函数

thread_1
返回,线程也不会退出。

这种行为符合标准吗?如果是这样,为什么?线程什么时候退出?

我也读过thread.threads,但似乎标准没有解释这一点。

c++ multithreading c++17 stdthread thread-local
1个回答
0
投票

我尝试在 clang 、 VS 2019 和 gcc 上进行测试,它的工作原理。 我理解,TDM gcc 不适合使用。

© www.soinside.com 2019 - 2024. All rights reserved.