现在,C++将thread_local存储添加为语言功能,我想知道一些事情:

  • thead_local可能要花多少钱?
  • 在内存中?
  • 用于读写操作吗?
  • 与此相关联:操作系统通常如何实现此目的?似乎所有声明的thread_local都必须为每个创建的线程提供特定于线程的存储空间。
  • 最佳答案

    存储空间:变量的大小*线程数,或者可能是(sizeof(var)+ sizeof(var *))*线程数。

    有两种实现线程本地存储的基本方法:

  • 使用某种系统调用来获取有关当前内核线程的信息。 Sloooow。
  • 使用可能在处理器寄存器中的某个指针,该指针由内核在每个线程上下文切换时正确设置-与所有其他寄存器同时设置。贱。

  • 在Intel平台上,变体2通常是通过某些段寄存器(FS或GS,我不记得了)实现的。 GCC和MSVC都支持此功能。因此,访问时间与全局变量一样快。

    这也是可能的,但实际上我还没有看到,可以通过现有的库函数pthread_getspecific来实现。这样,性能将类似于1.或2.,再加上库调用开销。请记住,变体2。+库调用开销仍然比内核调用快很多。

    08-26 18:32
    查看更多