0

我正在经历 c++ 0x (C++11) 中对多线程的新支持。

所以每个线程都有一个 std::thread:id 类型的唯一标识符。

考虑以下示例程序:

void hello_world()
{
  std::cout<<"hello_world \n";
}

int main()
{

    std::cout<<"Main thread id is "<<std::this_thread::get_id()<<"\n";

    std::thread t(hello_world);

    std::cout<<"Child thread id is ";
    std::cout<<t.get_id()<<"\n";
    t.join();
}

我得到了一个示例输出,如下所示:

主线程 ID 为 140502917359424

子线程 ID 为 140502900623104

你好世界

我的示例输出中主线程的线程 ID 大于子线程 ID。

线程 ID 是否完全独立于它们的启动时间?

如果不是:有没有办法区分线程 T1 是否比线程 T2 早于线程 ID 启动?

4

2 回答 2

8

std::thread::get_id()只是一个任意值,它唯一的属性是保证它对于当前运行的每个线程都是唯一的(但是当一个线程结束时,它的 id 可以被重用)。

为了知道哪个线程首先启动,您只需要自己做:例如。维护一个计数器并以某种方式将值与线程相关联,或者通过将两者包装在一个类中,或者将值传递给线程函数,或者使用线程本地存储,......你明白了。

我想不出任何 C++ 或系统工具可以为你做这件事,也许是因为知道一堆线程的相对创建顺序通常是没有意义的。你只是解雇他们,让他们做他们的工作。

于 2013-03-17T11:22:54.190 回答
3

线程 id 和线程创建之间不能有严格的关系。线程由其他线程创建,因此这种创建可能并行发生。通常线程 id 只是一个(重新解释的)指向线程内部状态的指针,因此您不应该尝试将任何内容解释为它。

于 2013-03-17T13:22:55.373 回答