Я недавно обновил версию Visual Studio (2019), над которой я работаю, и перекомпилирую довольно старую кодовую базу, написанную предыдущим разработчиком. При компиляции возникает следующая проблема:
C3861: '_WriteBarrier': идентификатор не найден
Это происходит из следующего блока кода:
inline void SetValueWithRelease(volatile unsigned int* p, int newval)
{ *p = newval; _WriteBarrier(); }
My понимание _writebarrier очень ограничено, но я считаю, что цель этого intrinsi c состоит в том, чтобы компилятор в многопоточной среде не пытался быть «умным» в оптимизации кода и в конечном итоге позволял другие потоки по неосторожности используют непредусмотренную версию p.
Но, что касается преодоления этой проблемы устаревания, из того, что я прочитал, мой лучший вариант - использовать atomic_thread_fence: https://docs.microsoft.com/en-us/cpp/standard-library/atomic-functions?view=vs-2019#atomic_thread_fence
Предполагая, что это правильно, я склонен использовать опцию «memory_order_seq_cst» в этой функции, но я не уверен.
Буду признателен за любые указания или указания для разъяснения.