我需要从我不控制的线程中访问线程ID(它在异步回调函数中,并且从一组不同的线程调用)。
我想知道访问线程ID在性能方面是否昂贵?
我打算在Windows中使用boost::this_thread::get_id()
或GetCurrentThreadId()
。
为了澄清,我需要为数据从我的回调到达时准备好一些本地缓存数组,并且我正在计划,以避免错误并锁定为每个线程使用本地缓存,并使用正确的缓存访问线程ID。 另外因为来的数据总是大小不同,我不能把它放在堆栈中,我想避免一直创建和删除堆数据。
答案 0 :(得分:6)
Windows将所有特定于线程的信息存储在所谓的TEB中。在x86中,fs
寄存器指向此结构的开头,在x64中它是gs
寄存器。
在x86窗口中,线程ID存储在FS:[0x24]
,这可能是相当便宜的访问。将信息存储在线程本地存储中涉及一个额外的间接(我们从TEB获取TLS的地址),因此它与您的手动私有缓存基本相同 - 只是为您工作的更少。
答案 1 :(得分:2)
答案 2 :(得分:2)