Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取线程ID在性能方面是否昂贵?_C++_Multithreading_Caching - Fatal编程技术网

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

C++ 获取线程ID在性能方面是否昂贵?,c++,multithreading,caching,C++,Multithreading,Caching,我需要从我不控制的线程访问线程ID(它位于异步回调函数中,从一组不同的线程调用) 我想知道访问线程ID在性能方面是否昂贵 我计划从windows使用boost::this\u-thread::get\u-id()或GetCurrentThreadId() 为了澄清这一点,我需要准备一些本地缓存阵列,以便在数据从回调到达时使用,我正在计划,以避免错误和锁定,为每个线程使用本地缓存,并使用线程id访问正确的缓存。 另外,由于数据的大小总是不同的,我无法将其放入堆栈中,我希望避免一直创建和删除堆数据。

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

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

我计划从windows使用
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线程函数的包装。除了可移植性,这两者之间没有什么区别。拥有线程本地缓存不是更容易吗?让编译器担心访问线程的正确缓存。这是个好主意。他们仍然没有真正提到表演。