2017-02-15 6 views
2
#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); 
} 

"thread_local"は裸のスレッドで動作しますか? <a href="http://en.cppreference.com/w/cpp/language/storage_duration" rel="nofollow noreferrer">cppreference</a>によれば

オブジェクトは、スレッドが開始されると割り当てられ スレッドが終了したときに割り当て解除されます。各スレッドには、オブジェクトの独自のインスタンスがあります。 オブジェクトがthread_localと宣言されている場合にのみ、この保存期間があります。

どのようにC++コンパイラが知っているん裸スレッド(というstd::threadより)が作成され、終了すると:?私は疑問に思う

言い換えれば

:裸のスレッド関数fが終了した後、C++標準保証A::~A()

と呼ばれるのか?

+6

これはC++標準の観点からは答えが難しい。なぜなら、C++標準ではあなたが使っている方法では「裸のスレッド」という概念がないからです。もちろん、C++スレッドはプラットフォーム固有の方法で実装されています。同じ実装を直接コーディングすると、同じ動作になる可能性があります。 –

答えて

4

C++標準では、pthread_createに電話をしたときに何が起こるかについて何も言及していません。そのことを知りたければ、C++標準以外の場所を見なければなりません。残念ながら、POSIX標準では、C++スレッドのローカルオブジェクトについては何も言及していません。したがって、POSIX標準では何も言わないでしょう。

つまり、特定のプラットフォームで発生したことは、その特定のコンパイラ、プラットフォーム、またはスレッド標準に関するドキュメントで具体的な記述がない限り保証されません。

関連する問題