Как с ++ составляет атомарные операции? - PullRequest
0 голосов
/ 29 января 2019

C ++ atomic - хорошая вещь, мой вопрос только в том, как они сочетаются друг с другом.

    uint64_t lpp = (place_st++ == A-1)? place_st.exchange(0) : place_st.load();

    ...
    atomic<uint64_t> place_st;
    ...

Итак, есть ли гарантия, что эти операции будут выполняться ТОЛЬКО одна за другой, как в транзакционной памяти

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Нет, никакой гарантии на это не будет, что сделает код небезопасным (один поток может увидеть значение больше A, а приращение может быть «потеряно» на place_st.exchange(0).

Самое простое, что можно сделать здесь, это просто считать place_st «развернутым» и вручную делать uint64_t lpp = place_st++ % A, чтобы получить «завернутую» версию. Кроме того, чтобы получить такое поведение, которое вам в основном нужно сравнить-and-swap в цикле (см. , как реализовать простое сравнение и замена в C ++ для общего счетчика ), а не атомарный прирост, чтобы получить приращение и перенос, чтобы вести себя атомарно. Так как вы толькоработая с одной переменной, вы можете использовать CAS для эмуляции подхода к транзакционной памяти, который вы рассматривали.

0 голосов
/ 29 января 2019

Атомарные операции обещают только атомарность (и относительное упорядочение при правильных параметрах): неспособность других операций в разных потоках мешать их операциям.Две операции, которые являются атомарными, по-прежнему две операции , поэтому между ними могут происходить какие-то вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...