Будет ли 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,

Другие вопросы по тегам