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

6
我需要访问我无法控制的线程的线程ID(它在一个异步回调函数中,可从一组不同线程中调用)。
想知道访问线程ID是否在性能方面很耗费资源?
我计划使用boost::this_thread::get_id()GetCurrentThreadId()来实现。
需要澄清的是,当数据从我的回调函数到达时,我需要准备一些本地缓存数组,并且为避免错误和锁定,计划为每个线程使用本地缓存,并使用线程ID访问正确的缓存。 由于传入的数据大小始终不同,因此无法将其放入堆栈中,并且希望避免反复创建和删除堆数据。

我怀疑它会有影响,但你可以简单地测量一下。 - nogard
boot::threads 只是 Windows 上 Win32 线程函数的一个包装器。除了可移植性之外,两者之间几乎没有什么区别。 - Will
有一个线程本地缓存不是更容易吗?让编译器担心为线程访问正确的缓存。 - MSalters
3个回答

9

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

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


3
根据MSDN (DevDiv#1039430),在VS2015之前,this_thread::get_id()速度过慢。他们没有说明具体有多慢。

2

这是一个好主意。但他们仍然没有真正提到性能。 - 0x26res

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接