Будет ли fetch_add с расслабленным порядком памяти возвращать уникальные значения? - PullRequest
0 голосов
/ 12 февраля 2019

Представьте себе N потоков, выполняющих следующий простой код:

int res = num.fetch_add(1, std::memory_order_relaxed);

, где num:

std::atomic<int> num = 0;

Совершенно безопасно предположить, что res для каждого запущенного потокакод будет другим или возможно, что он будет одинаковым для некоторых потоков?

1 Ответ

0 голосов
/ 12 февраля 2019

Да.Все потоки будут согласовывать порядок, в котором различные потоки модифицировали переменную num;k-ный поток для выполнения этой строки кода определенно получит значение k.Использование std::memory_order_relaxed, однако, подразумевает, что обращения к num не синхронизируются друг с другом;таким образом, например, один поток может изменить некоторую другую атомарную переменную x до того, как она изменит num, а другой поток может увидеть изменение num, сделанное предыдущим потоком, но впоследствии увидеть старое значение x.

...