c ++ 11中的线程id行为

时间:2013-03-17 11:09:39

标签: c++ multithreading c++11

我正在经历对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

程序hello_world

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

线程ID是否完全独立于开始时间?

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

2 个答案:

答案 0 :(得分:8)

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

为了告诉哪个线程首先开始你只需要自己做:例如。维护一个计数器并以某种方式将值与线程相关联,或者通过将它们包装在一个类中,或者将值传递给线程函数,或者使用线程局部存储,......你明白了。

我无法想到任何为你做这件事的C ++或系统工具,也许是因为知道一堆线程的相对创建顺序通常是没有意义的。你只需要解雇他们,让他们完成自己的工作。

答案 1 :(得分:3)

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