Устаревание _writeBarrier () - PullRequest
       76

Устаревание _writeBarrier ()

1 голос
/ 17 февраля 2020

Я недавно обновил версию 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» в этой функции, но я не уверен.

Буду признателен за любые указания или указания для разъяснения.

1 Ответ

3 голосов
/ 17 февраля 2020

В идеале вы могли бы преобразовать из свернутых вручную атомиков с помощью volatile в использование atomic<int> *p с p->store(newval, std::memory_order_release); В противном случае вы зависите от компилятора, поскольку взаимодействие между volatile и атомными c заборами потоков .

Я бы предположил, что atomic_thread_fence(std::memory_order_release) должно нормально работать на существующих компиляторах, чтобы превратить свернутый вручную расслабленный магазин с volatile в релиз-магазин.

...