我在多线程 C++11 软件中有 2 种类似情况:
- 我在方法声明中用作查找表的数组
- 一个数组,我用作在方法外部声明的查找表,并且通过引用或指针被不同的多个方法使用。
现在,如果我们暂时忘记这个 LUT,我们只考虑 C++11 和通用方法的多线程方法,那么就存储持续时间而言,这种方法最合适的限定符可能是thread_local
.
这样,如果我将一个方法foo()
提供thread_local
给 3 个线程,我基本上最终foo()
每个线程都有 3 个实例,这一举措“解决”了foo()
在 3 个不同线程之间共享和访问的问题,避免缓存丢失,但我基本上有 3 个我的 foo() 可能有不同的行为,例如,如果我在 foo() 中实现了相同的 PRNG,并且我提供了一个与时间相关且分辨率非常好的种子,那么每个线程我可能会得到 3 个不同的结果并且在一致性方面确实一团糟。
但是假设我对工作方式很好,我thread_local
如何写下我需要保持 LUT 始终准备好并为我的方法缓存的事实?
我读过一些关于宽松或不那么宽松的内存模型的内容,但在 C++11 中,我从未见过可以注入数组/LUT 缓存的关键字或实际应用程序。
我在 x86 或 ARM 上。
我可能需要一些与volatile
基本相反的东西。