как использовать атомарность с ++ - PullRequest
0 голосов
/ 31 декабря 2018

Я запутался в атомарных переменных C ++.Если у меня есть атомарный x, который я хочу увеличить в одном потоке и прочитать в другом, могу ли я сделать ++ x или мне нужно сделать x.atomic_fetch_add (1).В ветке читатель могу ли я сделать что-то вроде cout << x;или я должен сделать cout << x.load (). </p>

Если у меня есть

int x;
atomic<bool> y;

, то в первом потоке

if (!y)
{
   x = 23;
   y = true;
}

и во втором потоке

if (y)
{
   cout << x;
   y = false;
}

Гарантируется ли, что поток два увидит значение (не атомарное) x как 23. Если нет, если я изменю доступ к y для использования загрузки и сохранения, это изменит?Гарантируется ли, что второй поток увидит результат всех неатомарных операций, которые выполняются до того, как первый поток установит для y значение true?

Может ли кто-нибудь предложить книгу, в которой эти детали будут четко объяснены.

1 Ответ

0 голосов
/ 31 декабря 2018

Подводя итог, вы можете задать себе два вопроса с переменной y:

  • Правильно ли выполнена операция, когда переменная является общей для потоков?

Этоделать с атомарностью операции, т.е. делать все за один раз.Atomicity предоставляет вам эту гарантию

  • После завершения операции хотите, чтобы все потоки видели одинаковый порядок операций?Цитирование Энтони Уильямса в Параллелизм C ++ в действии

Даже если потоки выполняют один и тот же бит кода, они могут не соглашаться в порядке событий из-за операций вдругие потоки при отсутствии конкретных ограничений на порядок , поскольку разные кэши ЦП и внутренние буферы могут содержать разные значения для одной и той же памяти

Это связано с памятьюorder

Как объяснено в комментариях, у ваших операций есть достаточный уровень порядка памяти, чтобы гарантировать то, что вам нужно.

Например, последовательная согласованность присвоения - memory_order_seq_cst, см. ссылку ссылка здесь

Надеюсь, это поможет

...