gpt4 book ai didi

c++ - Long Atomic Int 的实现

转载 作者:行者123 更新时间:2023-11-28 03:20:47 24 4
gpt4 key购买 nike

我想使用一个通常计数为 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 个线程之间共享(蒙特卡洛模拟的样本计数器)

谢谢!

最佳答案

这不是整体原子的,看下面的例子:

  • hi=0,lo=INT_MAX
  • T1 调用value(),获取lo=INT_MAX,被中断
  • T2 调用 increment() 将 hi 递增到 1
  • T1恢复读取counterHi,得到1,返回值为2^32 + INT_MAX

这可能不是您想要的。就不能直接拆分你的样本空间,让每个线程计算n/8项而不去争锁吗?

关于c++ - Long Atomic Int 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15497287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com