<div dir="ltr">Hi,<div><br></div><div><div>I am working on Wintun support for OpenVPN..</div><div><br></div><div>I am a bit unsure about the purpose of volatile in Wintun.</div><div><br></div><div>According to <a href="https://en.cppreference.com/w/cpp/atomic/memory_order" target="_blank">https://en.cppreference.com/w/cpp/atomic/memory_order</a>, volatile ensures that accesses are not reordered within the thread of execution, but order is not guaranteed to be observed by another thread.</div><div><br></div><div>On the other hand, Visual Studio generates memory barriers while accessing volatile objects and targeting non-ARM architectures <a href="https://docs.microsoft.com/en-us/cpp/cpp/volatile-cpp?view=vs-2019#microsoft-specific" target="_blank">https://docs.microsoft.com/en-us/cpp/cpp/volatile-cpp?view=vs-2019#microsoft-specific</a>. However, it also says that "for architectures other than ARM we strongly recommend that you specify /volatile:iso, and use explicit synchronization primitives and compiler intrinsics when you are dealing with memory that is shared across threads."</div><div><br></div><div>A few question I would like to ask:</div><div><br></div><div>- Is guarantee that accesses are not reordered within the thread of execution is enough?</div><div><br></div><div>- Do we rely on Microsoft-specific behavior of volatile for non-ARM architecture?</div><div><br></div><div>- Could reordering performed in ARM be a problem? If yes, shouldn't we (wintun and client app) use memory fences to synchronize accesses between threads? In openvpn3 we use C++11 so we were thinking about std::atomic_long with acquire/release semantics.</div></div><div><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">-Lev</div></div></div>