недопустимая инициализация неконстантной ссылки типа «Node*&» из rvalue типа «std::atomic‹Node*›::__pointer_type {aka Node*}»

У меня есть следующий фрагмент кода:

struct Node {
   int data;
   Node *next;
};

atomic<Node*> head;
atomic<Node*> temp1 = head.load();
..
Node *temp2 = new Node;
//initialise values
head.compare_exchange_strong(temp1, temp2);

Однако я получаю следующую ошибку:

недопустимая инициализация неконстантной ссылки типа «Node*&» из rvalue типа «std::atomic::__pointer_type {aka Node*}».

Я не понимаю, какая ссылка здесь постоянна. Любая помощь будет оценена.


person Community    schedule 13.10.2017    source источник


Ответы (1)


Простой ответ заключается в том, что temp1 должен быть Node*, а не Atomic, поскольку cmp/xchg принимает две переменные простого типа.

Но я не совсем понимаю, чего вы пытаетесь достичь. Конечно, если вы хотите, чтобы рядом была защита от многопоточности, то ее следует объявить Atomic внутри структуры?

person Gem Taylor    schedule 13.10.2017
comment
Первый пример здесь en.cppreference.com/w/cpp/atomic/atomic/ compare_exchange не делает их следующее поле атомарным. Я считаю, что это должно сработать. - person ; 13.10.2017