Мой тестовый код приведен ниже, и я обнаружил, что только memory_order_seq_cst
запретил компилятор.
#include <atomic>
using namespace std;
int A, B = 1;
void func(void) {
A = B + 1;
atomic_thread_fence(memory_order_seq_cst);
B = 0;
}
И другие варианты, такие как memory_order_release
, memory_order_acq_rel
, вообще не генерировали никакого компилятора.
Я думаю, что они должны работать с атомной переменной, как показано ниже.
#include <atomic>
using namespace std;
atomic<int> A(0);
int B = 1;
void func(void) {
A.store(B+1, memory_order_release);
B = 0;
}
Но я не хочу использовать атомную переменную. В то же время, я думаю, что "asm (" ":" memory ")" слишком низкий уровень.
Есть ли лучший выбор?