this_thread :: get_id()总是在每个新线程开始时递增

时间:2016-11-04 09:10:33

标签: c++ multithreading visual-studio

我可以按照以下方式将线程ID打印到控制台:

[1, 2, 3, 4, 5, 6]

在此之后,打印到控制台的ID对应于可在Visual Studio 2013社区中找到的ID:

cout << "thread ID: "  << std::this_thread::get_id() << endl;

如果我在Debug -> Windows -> Threads -> [ID column] 中通过此ID进行升序排序,我是否获得了线程启动的顺序?或者换句话说:Debug -> Windows -> Threads总是在每个新线程开始时递增,还是也可以递减?

2 个答案:

答案 0 :(得分:3)

简答:没有,线程ID不一定随每个新线程递增。线程ID可以重复使用。

标准说

  
      
  1. thread :: id类型的对象为每个对象提供唯一标识符   执行线程和所有线程对象的单个不同值   不代表执行的线程(30.3.1)。每个线程   execute有一个关联的thread :: id对象,它不等于   thread ::任何其他执行线程的id对象,而不是   等于没有的任何std :: thread对象的thread :: id对象   表示执行线程。

  2.   
  3. thread :: id应该是一个简单的   可复制的类(第9条)。库可以重用a的值   thread ::已终止线程的id,无法再加入。

  4.   

- n4296; 30.3.1.1 [thread.thread.id]

它没有说ID是单调增加的,确实允许重用线程ID。

您可能需要native_handle,这将是底层实现使用的句柄。这将对应于MSVC下的Windows线程句柄。这些是否单调增加是您实施文档的问题。

GetCurrentThreadId函数的MSDN文档表明线程ID唯一标识一个线程,直到它终止;它并没有说出这些ID是否单调增加,并且该句子的含义似乎是它们可以重复使用。

总之, C ++标准不保证线程ID的值。如果你想保证这一点,你需要让每个线程增加一个原子计数器,或者通过适当的同步获得单调增加的值。

答案 1 :(得分:0)

答案是 可能 。对于特定的实现,它是一个有用的调试启发式(特别是如果线程句柄很接近)。

另一方面,如果你想依赖它来获得程序的正确性,那么标准显然没有这样的保证,你需要用其他方式解决你的潜在问题。