Переменные C ++ atomi c не могут быть назначены друг другу: почему? Это возможно? - PullRequest
2 голосов
/ 28 марта 2020

В последнее время я занимался математикой с числами std::atomic_llong, и недавно я получил эту ошибку.

error: use of deleted function ‘std::atomic<long long int>& std::atomic<long long int>::operator=(const std::atomic<long long int>&)’
  202 |     currquadtickpos = prevquadtickpos;
      |                       ^~~~~~~~~~~~~~~
In file included from /home/$USER/position.cpp:21:
/usr/include/c++/9/atomic:848:15: note: declared here
  848 |       atomic& operator=(const atomic&) = delete;
      |               ^~~~~~~~

По сути, я пытался взять значение атоми c и присвоить его. к другому значению атома c, делая обе переменные атома c равными. Однако по какой-то причине это не разрешено.

Почему не разрешено присваивание атома c?

А затем, учитывая ответ на вопрос выше, есть ли другой способ сделать это? атоми c присвоение номера?

Ответы [ 2 ]

4 голосов
/ 28 марта 2020

Прямое присвоение типов атомов c запрещено по очень веской причине. Типы Atomi c имеют ряд операций, которые выглядят как обычные операции C ++, но на самом деле они дают вам больше гарантий, чем обычно могли бы выполнять эти операции. Например, some_atomic++ - это приращение атома c (которое возвращает исходное значение), а some_int++ - это просто целочисленное приращение без гарантий видимости или атомарности.

Если вы делаете что-то вроде atomic2 = atomic1 может сложиться впечатление, что все это выражение представляет собой атом c, что это атом c для чтения / изменения / записи двух переменных. Это не так; это будут две последовательные атомы c операции: чтение atomic1 и запись atomic2. Две последовательные операции атома c не совпадают с одной операцией атома c.

Чтобы точно понять, что не происходит , они заставляют вас произнести это по буквам out: atomic2 = atomic1.load(...).

4 голосов
/ 28 марта 2020

Как вы можете видеть здесь , атомы не являются ни копируемыми, ни подвижными. Если вы хотите скопировать значение из одного атома c в другой, используйте что-то вроде a.store(b.load()). Пример:

#include <atomic>
#include <iostream>

int main() {
    std::atomic_llong a;
    std::atomic_llong b;
    a.store(4);
    b.store(5);
    // prints 4 then 5
    std::cout << a.load() << std::endl;
    std::cout << b.load() << std::endl;
    // the important line
    a.store(b.load());
    // prints 5 then 5 (value got copied)
    std::cout << a.load() << std::endl;
    std::cout << b.load() << std::endl;
    return 0;
}
...