Будет ли fetch_add с расслабленным порядком памяти возвращать уникальные значения?
Представьте себе N потоков, выполняющих следующий простой код:
int res = num.fetch_add(1, std::memory_order_relaxed);
где num
является:
std::atomic<int> num = 0;
Совершенно безопасно предположить, что res
для каждого потока работающий код будет разным или возможно, что он будет одинаковым для некоторых потоков?
1 ответ
Да. Все потоки будут согласовывать порядок, в котором различные потоки модифицировали переменную num
; k-ный поток для выполнения этой строки кода определенно получит значение k. Использование std::memory_order_relaxed
Однако подразумевается, что доступ к num
не синхронизироваться друг с другом; таким образом, например, один поток может изменить некоторую другую атомарную переменную x
прежде чем он изменяет num
и другой поток может увидеть модификацию num
сделанный прежним потоком, но впоследствии видят старое значение x
,