Я написал пример программы, в которой я намеренно не присоединился к потоку t1.
Пример:
$include <iostream>
#include <thread>
using namespace std;
void fun3()
{
cout << "t1:: "<<this_thread::get_id() << endl;//prints t1 Thread ID.
}
void myterminate() {
cout << "terminate:: "<<this_thread::get_id() << endl;//prints main thread ID!!
//Why it is not printing thread t1's id ??
abort(); // forces abnormal termination
}
int main()
{
cout << "main:: "<<this_thread::get_id() << endl;//prints main Thread ID
std::set_terminate(myterminate);
thread t1(fun3);
//t1.join(); // intentionally commented to see who will call terminate method.
getchar();
return 0;
}
Мое понимание (которое может быть неправильным):
Когда управление достигнет конца функции main (), будет вызван деструктор thread t1 .
~thread() _NOEXCEPT
{
if (joinable())
_XSTD terminate(); //<-- thread t1 will be calling this method
}
Так как поток t1 вызывает метод terminate (), то метод myterminate () должен вывести идентификатор потока t1. Но вместо печати идентификатора потока t1
это печать основного идентификатора потока.
Так что я сомневаюсь - почему myterminate () метод выводит идентификатор основного потока вместо идентификатора дочернего потока?
PS- Я изучаю программирование потоков, поэтому, пожалуйста, прости, если я пропустил очевидную концепцию.
Спасибо.