【发布时间】:2013-06-30 20:33:13
【问题描述】:
我在多线程 C++11 软件中有 2 种类似情况:
- 我在方法声明中用作查找表的数组
- 一个数组,我用作在方法外部声明的查找表,并且通过引用或指针被不同的多个方法使用。
现在,如果我们暂时忘记这个 LUT,而只考虑 C++11 和泛型方法的多线程方法,那么就存储持续时间而言,这种方法最合适的限定词可能是 thread_local。
这样,如果我将 foo() 即 thread_local 的方法提供给 3 个线程,我基本上最终会为每个线程提供 3 个 foo() 实例,这一举措“解决”了 foo() 被共享和在 3 个不同的线程之间访问,避免缓存丢失,但我的 foo() 基本上有 3 种可能的不同行为,例如,如果我在 foo() 中实现了相同的 PRNG,并且我提供了一个与时间相关的种子好和高分辨率,我可能会在每个线程中得到 3 个不同的结果,并且在一致性方面真的一团糟。
但是假设我对 thread_local 的工作方式很好,我如何写下我需要保持 LUT 始终准备好并为我的方法缓存的事实?
我读过一些关于宽松或不那么宽松的内存模型的文章,但在 C++11 中,我从未见过可以注入数组/LUT 缓存的关键字或实际应用程序。
我使用的是 x86 或 ARM。
我可能需要与volatile 基本相反的东西。
【问题讨论】:
-
当然,最简单的事情就是不分享。它们很大吗?如果你需要分享,TBB 有几个实现。如果你用谷歌搜索“并发哈希表 C++”,有很多 answers 相关的:)。如果您使用 VS,您可以使用 concurrent_unordered_map
-
@DmitryLedentsov 感谢您的提示,但它可能不适合我,我想用纯 C++11 编写它以实现可移植性和更好的投资,我也想学习如何做到这一点靠我自己,是的,我的 LUT 可能很大,想象一下 LUT 包含一个大调色板或一组类似的值。我的问题不是让这个数组成为一个并发数据结构,而是如何让它缓存。
-
我明白了。您的问题的性质与功能本身无关。我首先会选择标准库:concurrent_unordered_map,只有在我真的需要时才开始构建自己的库。所以,也许,重新考虑架构会减少对特殊并发查找表的需求
-
thread_local只能应用于变量或静态数据成员——谈论“thread_local的方法”是没有意义的
标签: multithreading c++11 thread-local