Зачем получать идентификатор основного потока вместо идентификатора дочернего потока при завершении вызова - PullRequest
0 голосов
/ 06 января 2019

Я написал пример программы, в которой я намеренно не присоединился к потоку 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- Я изучаю программирование потоков, поэтому, пожалуйста, прости, если я пропустил очевидную концепцию.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...