首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Long Atomic的实现

Long Atomic的实现
EN

Stack Overflow用户
提问于 2013-03-19 18:46:15
回答 2查看 401关注 0票数 0

我想使用原子计数器(多线程计算),它通常计数到2^40,所以我不能直接使用32位int原子计数器。我还没有c++11 (我将迁移到它,但还没有,因为这对我来说是有成本的),我必须在32位和64位平台上编译。我目前使用的是QT,所以我可以使用QAtomicInt。

以下是我的想法:

代码语言:javascript
复制
(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个线程之间共享(蒙特卡洛模拟的样本计数器)

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-03-19 19:17:50

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

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

这可能不是您想要的。难道你不能分割你的样本空间,让每个线程计算n/8个项目,而不争用一个锁吗?

票数 1
EN

Stack Overflow用户

发布于 2013-03-19 19:25:48

我建议使用保护(互斥或临界区)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15497287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档