У меня есть древовидная структура как:
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);
Почему первый подход не работает для вас? Если вы не собираетесь выполнять атомарное обновление всего массива, это путь. Я успешно скомпилировал следующий код:
struct node
{
unsigned long key;
tbb::atomic<struct node*> childrenArray[2];
};
void main() {
node n;
n.childrenArray[0].compare_and_swap(0,0);
}