我正在经历对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开始?
答案 0 :(得分:8)
std::thread::get_id()
只是一个任意值,它唯一的属性是保证当前运行的每个线程都是唯一的(但是当一个线程结束时,它的id可以被重用)。
为了告诉哪个线程首先开始你只需要自己做:例如。维护一个计数器并以某种方式将值与线程相关联,或者通过将它们包装在一个类中,或者将值传递给线程函数,或者使用线程局部存储,......你明白了。
我无法想到任何为你做这件事的C ++或系统工具,也许是因为知道一堆线程的相对创建顺序通常是没有意义的。你只需要解雇他们,让他们完成自己的工作。
答案 1 :(得分:3)
线程ID和线程创建之间不存在严格的关系。线程由其他线程创建,因此这种创建可能并行发生。通常,线程id只是指向线程内部状态的(重新解释)指针,因此您不应该尝试将任何内容解释为它。