【问题标题】:Do you know of some performances test of the different ways to get thread local storage in C++?你知道在 C++ 中获取线程本地存储的不同方法的一些性能测试吗?
【发布时间】:2011-02-24 02:34:23
【问题描述】:

我正在做一个广泛使用线程局部变量的库。 您能否指出一些基准测试在 C++ 中获取线程局部变量的不同方法的性能:

  • C++0x 线程局部变量
  • 编译器扩展(Gcc __thread, ...)
  • boost::threads_specific_ptr
  • 线程
  • 窗户
  • ...

C++0x thread_local 是否在提供它的编译器上表现得更好?

【问题讨论】:

  • 我没有做过任何测试,但如果它们被编译成不同的东西(可能有例外 pthreadWindows)我会感到惊讶,即标记为线程本地的可执行文件部分。
  • 这个问题有什么结论吗?

标签: c++ boost c++11 thread-local


【解决方案1】:

您始终可以使用time.h。在测试性能时它是您的朋友,没有其他可用的东西。

【讨论】:

  • 我正在寻找的是在不同上下文中使用的基准。当然我可以自己做,但如果有的话,我更愿意重用它。也许你对 Boost.Chrono 感兴趣 :)
【解决方案2】:

这些通常实现为线程私有内存空间中数组中的简单偏移量。因此,访问T 类型的线程特定变量X

T y = X;

大致翻译为,

T y = *(T*)(cur_thread.local_tbl[key_X]);

这太简单了,无法期望实现之间的性能差异很大。也就是说,如果您发现任何此类基准,请在此处跟进。

【讨论】:

  • 目前的Boost实现并不是那么简单,关键是thread_specific_pointer变量的地址。编译器现在可以在编译时获取密钥,并且可以进行一些优化。因此,我预计可用实现之间存在很大差异,这可能是深度使用线程特定存储的库的决定因素。
猜你喜欢
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 2012-07-11
  • 2019-02-03
  • 1970-01-01
  • 2018-09-08
  • 2012-07-14
  • 1970-01-01
相关资源
最近更新 更多