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)