是" thread_local"为裸线工作?

时间:2017-02-15 00:26:16

标签: c++ multithreading c++11 posix standards

#include <pthread.h>
#include <thread>
#include <iostream>

using namespace std;

struct A
{
    ~A()
    {
        cout << "~A()" << endl;
    }
};

void* f(void*)
{
    thread_local A a;
    return 0;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, f, nullptr);
    this_thread::sleep_for(5min);
}

根据cppreference

  

当线程开始时分配对象,并在何时释放   线程结束。每个线程都有自己的对象实例。只要   声明为thread_local的对象具有此存储持续时间。

我只是想知道:

C ++编译器如何知道何时创建并退出裸线程(而不是std::thread )?

换句话说:

裸线程函数A::~A()完成后是否会调用C ++标准保证f

1 个答案:

答案 0 :(得分:4)

C ++标准没有说明在您致电pthread_create时或之后发生的事情。因此,如果您想了解这一点,您必须寻找除C ++标准之外的其他地方。不幸的是,POSIX标准对C ++线程本地对象一无所知。所以POSIX标准也不会说什么。

这意味着,除非特定编译器,平台或线程标准的文档说明特定内容,否则无法保证在某个特定平台上发生的任何事情。