C++ 如何遍历所有线程\u局部变量?

C++ 如何遍历所有线程\u局部变量?,c++,multithreading,c++11,thread-local-storage,C++,Multithreading,C++11,Thread Local Storage,我想更新一个由多个线程更改的变量 我可以使用一个原子变量,并以原子方式递增它,但据说它的速度很慢 一个建议的解决方案是分配一个线程局部变量,并增加它 thread_local unsigned int _tls_size = 0U; /* ... */ _tls_size++; /* ... */ 这一步还可以,但现在的问题是计算跨线程存储的所有\u tls\u size的总和 有什么想法吗?我想用一个std::vector存储所有地址,但是: Visual Studio不喜欢它并返回了错误

我想更新一个由多个线程更改的变量

我可以使用一个原子变量,并以原子方式递增它,但据说它的速度很慢

一个建议的解决方案是分配一个线程局部变量,并增加它

thread_local unsigned int _tls_size = 0U;
/* ... */
_tls_size++;
/* ... */
这一步还可以,但现在的问题是计算跨线程存储的所有
\u tls\u size
的总和

有什么想法吗?我想用一个
std::vector
存储所有地址,但是:

  • Visual Studio不喜欢它并返回了错误
  • 当一根线脱落时会发生什么?相应的指针将不会引用有效内存

谢谢大家!

这取决于体系结构,但考虑到“VisualStudio”,TLS几乎可以保证速度与原子增量相同或较慢。在Windows TLS模型下,每次访问至少涉及两个不利于缓存的附加间接层。在最坏的情况下,它是一个W32 API调用。一个原子增量需要多少,十几个时钟?FWIW,我对Windows TLS的体验与上面@Damon所写的非常一致。嗨,问题是增量经常发生(它用于跟踪哈希表的大小),如果我能节省十几个时钟,那就太好了。实际上,使用thread_local是本白皮书中提到的一个想法,所以我决定实现它:(幻灯片39到46)