在性能方面获得的线程ID是否昂贵?

时间:2012-10-16 07:05:37

标签: c++ multithreading caching

我需要从我不控制的线程中访问线程ID(它在异步回调函数中,并且从一组不同的线程调用)。

我想知道访问线程ID在性能方面是否昂贵?

我打算在Windows中使用boost::this_thread::get_id()GetCurrentThreadId()

为了澄清,我需要为数据从我的回调到达时准备好一些本地缓存数组,并且我正在计划,以避免错误并锁定为每个线程使用本地缓存,并使用正确的缓存访问线程ID。 另外因为来的数据总是大小不同,我不能把它放在堆栈中,我想避免一直创建和删除堆数据。

3 个答案:

答案 0 :(得分:6)

Windows将所有特定于线程的信息存储在所谓的TEB中。在x86中,fs寄存器指向此结构的开头,在x64中它是gs寄存器。

在x86窗口中,线程ID存储在FS:[0x24],这可能是相当便宜的访问。将信息存储在线程本地存储中涉及一个额外的间接(我们从TEB获取TLS的地址),因此它与您的手动私有缓存基本相同 - 只是为您工作的更少。

答案 1 :(得分:2)

答案 2 :(得分:2)

根据MSDN (DevDiv#1039430),在VS2015之前

  

this_thread :: get_id()不必要地慢了

他们不会说多慢。