我可以按照以下方式将线程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
总是在每个新线程开始时递增,还是也可以递减?
答案 0 :(得分:3)
简答:没有,线程ID不一定随每个新线程递增。线程ID可以重复使用。
标准说
thread :: id类型的对象为每个对象提供唯一标识符 执行线程和所有线程对象的单个不同值 不代表执行的线程(30.3.1)。每个线程 execute有一个关联的thread :: id对象,它不等于 thread ::任何其他执行线程的id对象,而不是 等于没有的任何std :: thread对象的thread :: id对象 表示执行线程。
- 醇>
thread :: id应该是一个简单的 可复制的类(第9条)。库可以重用a的值 thread ::已终止线程的id,无法再加入。
- n4296; 30.3.1.1 [thread.thread.id]
它没有说ID是单调增加的,确实允许重用线程ID。
您可能需要native_handle
,这将是底层实现使用的句柄。这将对应于MSVC下的Windows线程句柄。这些是否单调增加是您实施文档的问题。
GetCurrentThreadId
函数的MSDN文档表明线程ID唯一标识一个线程,直到它终止;它并没有说出这些ID是否单调增加,并且该句子的含义似乎是它们可以重复使用。
总之, C ++标准不保证线程ID的值。如果你想保证这一点,你需要让每个线程增加一个原子计数器,或者通过适当的同步获得单调增加的值。
答案 1 :(得分:0)
答案是 可能 。对于特定的实现,它是一个有用的调试启发式(特别是如果线程句柄很接近)。
另一方面,如果你想依赖它来获得程序的正确性,那么标准显然没有这样的保证,你需要用其他方式解决你的潜在问题。