-1

我有两个线程 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在“关键路径”之前无法返回"线程已经写完任何存储?

这将允许我仅在罕见线程执行的偶尔情况下添加延迟。

4

1 回答 1

1

我不确定您的问题是否可行,但是您可以重构线程之间的“通信”以共享更少的状态。

例如,假设它们仅通过 进行“通信” a + b - c,即只有 t1 单独更新组件,而 t2 仅读取此特定组合。a在这种情况下,您可以通过将、b和定义c为常规变量并将新变量 、combination定义为原子变量来使用更少的原子操作。然后 t1 将正常增加内容,并使用单个原子操作来更新combination.

于 2015-05-30T12:32:04.413 回答