Hi, I am working on Wintun support for OpenVPN.. I am a bit unsure about the purpose of volatile in Wintun. According to https://en.cppreference.com/w/cpp/atomic/memory_order, volatile ensures that accesses are not reordered within the thread of execution, but order is not guaranteed to be observed by another thread. On the other hand, Visual Studio generates memory barriers while accessing volatile objects and targeting non-ARM architectures https://docs.microsoft.com/en-us/cpp/cpp/volatile-cpp?view=vs-2019#microsoft-specific. 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." A few question I would like to ask: - Is guarantee that accesses are not reordered within the thread of execution is enough? - Do we rely on Microsoft-specific behavior of volatile for non-ARM architecture? - 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. -- -Lev