2017-02-15 25 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); 
} 

В соответствии с cppreference:Работает ли «thread_local» для голой нити?

Объект выделяется, когда начинается нить и высвобождены, когда нить заканчивается. Каждый поток имеет свой собственный экземпляр объекта. Только объектов, объявленных thread_local, имеют срок хранения.

мне просто интересно:

Как работает C++ компилятор знает, когда голая нить (, а не std::thread) создана и вышла?

Других слова:

ли будет называться C++ стандартной гарантии A::~A() после обнаженной функции потока f закончена?

+6

Это трудно ответить с точки зрения C++, поскольку стандарт C++ не имеет понятия «голый поток», как вы его используете. Но, конечно же, потоки C++ будут реализованы с определенной платформой, и если вам удастся напрямую выполнить такую ​​же реализацию, вы, возможно, получите то же самое. –

ответ

4

Стандарт C++ ничего не говорит о том, что происходит, когда или после того, как вы звоните pthread_create. Поэтому, если вы хотите узнать об этом, вам придется искать в другом месте, кроме стандарта C++. К сожалению, стандарт POSIX ничего не говорит о локальных объектах потока C++. Таким образом, стандарт POSIX ничего не скажет.

Это означает, что все, что бы ни происходило на какой-либо конкретной платформе, не гарантируется, если только документация для этого конкретного компилятора, платформы или стандарта нитей не говорит о чем-то конкретном.

 Смежные вопросы

  • Нет связанных вопросов^_^