2013-03-17 60 views
0

我正在通过对C++ 0x(C++ 11)中存在的多线程的新支持。在C++中的线程ID行为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是否完全独立于其启动时间?

如果不是:有没有一种方法来区分线程T1是否早于线程T2从线程ID开始?

回答

8

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

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

我想不出有什么C++或系统工具可以为你做,也许是因为知道一堆线程的相对创建顺序通常是毫无意义的。你只需开火并让他们完成工作。

3

线程ID和线程创建之间不能有严格的关系。线程由其他线程创建,因此这种创建可能会并行发生。通常线程ID只是一个(重新解释的)指向线程内部状态的指针,所以你不应该试图解释任何东西。