this_thread::get_id()总是随着每个新线程的启动而增加吗?

Does this_thread::get_id() always increment with every new thread started

本文关键字:线程 启动 增加 新线程 id get thread this      更新时间:2023-10-16

我可以通过以下方式打印线程ID到控制台:

cout << "thread ID: "  << std::this_thread::get_id() << endl;
在此之后,打印到控制台的id对应于可以在Visual Studio 2013 Community中找到的id:
Debug -> Windows -> Threads -> [ID column]

如果我在Debug -> Windows -> Threads中对这个ID进行升序排序,我能得到线程启动的顺序吗?或者换句话说:std::this_thread::get_id()总是随着每一个新线程的启动而增加,或者它也可以递减?

简短的回答:no,线程ID不一定随着每个新线程而增加。线程id可以被重用。


标准说

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

  2. thread::id应该是一个平凡值类copyable的值(第9条)Thread::不能再连接的终止线程id。

——n4296;30.3.1.1 [thread.thread.id]

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

您可能需要native_handle,这将是底层实现使用的句柄。这将对应于MSVC下的Windows线程句柄。这些值是否单调递增取决于你的实现文档。

关于GetCurrentThreadId函数的MSDN文档建议线程ID唯一地标识一个线程,直到它终止;它没有说id是否单调递增,这句话的含义似乎是它们可以被重用。

总之,c++标准对线程id 的值没有提供保证。如果想要保证这一点,就需要让每个线程增加一个原子计数器,或者通过适当的同步获得一个单调递增的值。

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

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