атомная модификация элементов массива с использованием Intel TBB

У меня есть древовидная структура как:

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

Решение

Почему первый подход не работает для вас? Если вы не собираетесь выполнять атомарное обновление всего массива, это путь. Я успешно скомпилировал следующий код:

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

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

Другие решения


По вопросам рекламы [email protected]