我有两个线程 t1 和 t2,它们访问多个变量(整数和双精度数),我们称它们为 a、b 和 c。t1 在我的关键路径上,并通过昂贵的比较和交换来增加/减少这些变量。
std::atomic<double> a;
std::atomic<double> b;
std::atomic<double> c;
std::atomic<uint32_t> d;
.
.
.
// Extremely-common, critical path thread t1
d++;
while(!a.compare_and_exchange(expectedVal, newVal);
while(!b.compare_and_exchange(expectedVal, newVal);
while(!c.compare_and_exchange(expectedVal, newVal);
t2 很少发生,但当它发生时,它会将上面提到的变量加在一起。
// Rare thread, t2
return a + b - c;
目前我使用原子。有什么方法可以将变量声明为非原子的,因为 99.999% 的时间它们是从同一个线程和“稀有线程”递增的,我可以使用内存屏障来确保a + b - c
在“关键路径”之前无法返回"线程已经写完任何存储?
这将允许我仅在罕见线程执行的偶尔情况下添加延迟。