我有一个树节点结构:
struct node
{
unsigned long key;
tbb::atomic<struct node*> lChild;
tbb::atomic<struct node*> rChild;
};
我会在compare_and_swap
和lChild
上进行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);
答案 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);
}