5

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

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

我打算使用任何一个boost::this_thread::get_id()GetCurrentThreadId()从 Windows 中使用。

澄清一下,当数据从我的回调到达时,我需要准备一些本地缓存数组,我计划避免错误和锁定,为每个线程使用本地缓存,并使用线程 id 访问正确的缓存. 也因为进来的数据总是大小不一,所以不能入栈,想避免一直创建和删除堆数据。

4

3 回答 3

7

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

在 x86 窗口中,线程 id 存储在FS:[0x24],大概访问起来应该相当便宜。将信息存储在线程本地存储中涉及一个额外的间接(我们从 TEB 获取 TLS 的地址),因此它与您的手动私有缓存基本相同 - 对您来说工作量更少。

于 2012-10-16T07:28:25.670 回答
2

为什么不使用线程本地存储? http://www.boost.org/doc/libs/1_35_0/doc/html/thread/thread_local_storage.html

于 2012-10-16T07:12:48.077 回答
2

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

this_thread::get_id() 太慢了

他们没有说有多慢。

于 2016-07-05T16:40:39.187 回答