我有一个关键代码路径,其中线程使用整数上的原子增量来计算全局发生的事件数。这是相当快的,但仍然需要保存整数的缓存行在内核之间反弹。在 NUMA 系统中,这会产生大量的 MESI 流量。
hot pat 的伪代码是所有线程都这样做:
const int CHECK_VALUE = 42;
int counterNew = counter++;
if (counterNew == CHECK_VALUE) {
Do Final work
}
计数器是单调递增的,它必须达到的值是预先知道的。
至少一个线程必须断定全局计数器CHECK_VALUE
在递增后已达到counter
。多个线程得出该结论是可以接受的(我总是可以在那时同步它们 - 因为那不再是热门路径)。
counter
如果我知道它是单调的并且最终值已知,是否有可能比使用原子增量来跟踪值更好?