使用Intel TBB原子地修改数组元素

时间:2014-04-25 04:16:28

标签: c++ atomic tbb compare-and-swap

我有一个树节点结构:

struct node
{
    unsigned long key;                                           
    tbb::atomic<struct node*> lChild;
    tbb::atomic<struct node*> rChild;
};

我会在compare_and_swaplChild上进行rChild。 我希望将左右子项作为数组元素,并且仍然能够在单个数组元素上执行CAS。

注意:我不打算做双CAS

我试过了:

struct node
{
    unsigned long key;
    tbb::atomic<struct node*> childrenArray[2];
};

和此:

struct node
{
    unsigned long key;                                           
    tbb::atomic<struct node**> childrenArray;
};

但是这里各个数组元素不是原子的。如何修改此结构以便我可以执行CAS:

node->childrenArray[0].compare_and_swap(newNode,oldNode);

1 个答案:

答案 0 :(得分:3)

为什么第一种方法对你不起作用?除非您打算对整个阵列执行原子更新,否则它就是要走的路。我成功编译了以下代码:

struct node
{
    unsigned long key;
    tbb::atomic<struct node*> childrenArray[2];
};

void main() {
    node n;
    n.childrenArray[0].compare_and_swap(0,0);
}