В чем разница между явной атомной нагрузкой/хранилищем и обычным оператором = и оператором T?

Рассмотрим эти два варианта:

std::atomic<int> a;
a = 1;
int b = a;

и

std::atomic<int> a;
a.store(1);
int b = a.load();

Я вижу из документации, что вторая полностью атомарна, но я не понимаю, когда я должен использовать, что и какая разница в деталях.

Ответы

Ответ 1

Эти два примера эквивалентны; operator= и operator T определены как эквивалентные вызовам store и load соответственно, со значением по умолчанию для аргумента memory_order.

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