this_thread::get_id()总是随着每个新线程的启动而增加吗?
Does this_thread::get_id() always increment with every new thread started
我可以通过以下方式打印线程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可以被重用。
标准说
thread::id类型的对象为每个对象提供唯一标识符执行线程和所有线程对象的单独值不代表执行线程(30.3.1)。每根线执行有一个关联的线程::id对象,该对象不等于Thread::id对象的任何其他正在执行的线程,而不是等于任何std::thread对象的thread::id对象表示执行线程。
thread::id应该是一个平凡值类copyable的值(第9条)Thread::不能再连接的终止线程id。
——n4296;30.3.1.1 [thread.thread.id]
它没有说ID是单调递增的,而且它确实允许线程ID被重用。
您可能需要native_handle
,这将是底层实现使用的句柄。这将对应于MSVC下的Windows线程句柄。这些值是否单调递增取决于你的实现文档。
关于GetCurrentThreadId
函数的MSDN文档建议线程ID唯一地标识一个线程,直到它终止;它没有说id是否单调递增,这句话的含义似乎是它们可以被重用。
答案是可能是。对于一个特定的实现,它是一个有用的调试启发式方法(特别是当线程句柄很接近时)。
另一方面,如果你想依靠它来保证程序的正确性,那么标准显然没有这样的保证,你需要用其他的方法来解决你的潜在问题。
- 使用 std::string () const 函数启动线程或未来
- 如何创建线程序列以按照启动顺序执行任务?
- 启动类函数作为失去引用的线程
- 重新启动后,线程无法在 while 循环中再次运行
- 如何在C++上启动异步线程
- 计时器是否从另一个线程启动?
- 如何在 MFC 应用程序中启动 ZeroMQ 线程?
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 为什么 pthread_create() 返回 0 但线程从未启动
- 为什么 cuda-gdb 会启动多个线程?
- 对于每个线程,random_device是否以不同的状态启动?
- 线程启动延迟 - 通知所有未唤醒所有线程
- 等待多个线程启动,start() 未捕获
- Qt多线程启动线程错误
- 用信号通知线程启动特定的函数
- C++简单的线程启动问题
- - C++ - 使用计时器线程启动异常,精度毫秒
- 传递字符串作为线程启动例程参数:c++
- 错误:无法从另一个线程启动计时器.使用未声明计时器的QFuture
- QT线程:获取QObject::startTimer:计时器无法从另一个线程启动警告