C++ 获取线程ID在性能方面是否昂贵?
我需要从我不控制的线程访问线程ID(它位于异步回调函数中,从一组不同的线程调用) 我想知道访问线程ID在性能方面是否昂贵 我计划从windows使用C++ 获取线程ID在性能方面是否昂贵?,c++,multithreading,caching,C++,Multithreading,Caching,我需要从我不控制的线程访问线程ID(它位于异步回调函数中,从一组不同的线程调用) 我想知道访问线程ID在性能方面是否昂贵 我计划从windows使用boost::this\u-thread::get\u-id()或GetCurrentThreadId() 为了澄清这一点,我需要准备一些本地缓存阵列,以便在数据从回调到达时使用,我正在计划,以避免错误和锁定,为每个线程使用本地缓存,并使用线程id访问正确的缓存。 另外,由于数据的大小总是不同的,我无法将其放入堆栈中,我希望避免一直创建和删除堆数据。
boost::this\u-thread::get\u-id()
或GetCurrentThreadId()
为了澄清这一点,我需要准备一些本地缓存阵列,以便在数据从回调到达时使用,我正在计划,以避免错误和锁定,为每个线程使用本地缓存,并使用线程id访问正确的缓存。
另外,由于数据的大小总是不同的,我无法将其放入堆栈中,我希望避免一直创建和删除堆数据。为什么不使用线程本地存储?
Windows将所有特定于线程的信息存储在所谓的。在x86中,
fs
寄存器指向此结构的开头,在x64中它是gs
寄存器
在x86 windows中,线程id存储在FS:[0x24]
中,这可能是访问成本较低的地方。将信息存储在线程本地存储中需要一个额外的间接寻址(我们从TEB获得TLS的地址),因此它基本上与您的手动私有缓存相同-只需要较少的工作量。根据,在VS2015之前
此线程::get_id()速度太慢,不必要
他们并没有说它有多慢。我怀疑它是否有效果,但你可以简单地测量一下,这个
boot::threads
只是Windows上Win32线程函数的包装。除了可移植性,这两者之间没有什么区别。拥有线程本地缓存不是更容易吗?让编译器担心访问线程的正确缓存。这是个好主意。他们仍然没有真正提到表演。