我想使用一个通常计数为 2^40 的原子计数器(多线程计算),所以我不能直接使用 32 位 int 原子计数器。我还没有 c++11(我将迁移到它,但还没有,因为这对我来说是有成本的),我必须在 32 位和 64 位平台上编译。我目前使用 QT,所以我可以使用 QAtomicInt。
这是我的想法:
(initialization...)
QAtomicInt counterLo = 0;
QAtomicInt counterHi = 0;
void increment()
{
int before = counterLo.fetchAndAddOrdered(1);
if(before==INT_MAX)
{
counterHi.fetchAndAddOrdered(1); //Increment high word
counterLo.fetchAndAddOrdered(INT_MAX); //Increments low word to -1
counterLo.fetchAndAddOrdered(1); //Increments low word to 0
}
}
uint64_t value()
{
//Wait until the low word is non-negative
int lo = counterLow;
while(lo<0)
lo = counterLow;
return (uint64_t)counterHi * ((uint64_t)INT_MAX+1) + (uint64_t)lo;
}
这个对吗?我已经尝试使用互斥锁来制作计数器,但性能下降了大约 10%。这被称为每秒大约 100 万次,在 8 个线程之间共享(蒙特卡罗模拟的样本计数器)
谢谢!