原子变量 - 并发比较和交换与负载

时间:2017-12-20 13:31:35

标签: c++ multithreading concurrency tbb compare-and-swap

我试图实现一个通用原子数组,其中线程可以同时访问索引以加载/添加值。目前,数组项的数据类型是double。

我使用的是英特尔TBB库(尽管它与STL库具有相同的行为)。导致问题的操作是加载和并行添加。请参阅下文如何实施:

T operator[] (const unsigned int idx) const
{        
    return arr[idx].load();
}    

void add(const int idx, const valuetype_t delta) 
{
    T current = 0;
    do 
    {
        current = arr[idx];
    } while (arr[idx].compare_and_swap(current + delta, current) != current);
}      

我尝试在客户端代码中的并发添加和加载操作之间添加互斥锁,它完美地运行。但是,如果不使用互斥锁,结果就是错误的,看起来加载和比较以及交换并不能正常工作?!

0 个答案:

没有答案