diff options
Diffstat (limited to 'src/zencore/thread.cpp')
| -rw-r--r-- | src/zencore/thread.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/zencore/thread.cpp b/src/zencore/thread.cpp index 149a0d781..cb3aced33 100644 --- a/src/zencore/thread.cpp +++ b/src/zencore/thread.cpp @@ -156,6 +156,7 @@ Event::Event() auto* Inner = new EventInner(); Inner->bSet = bInitialState; m_EventHandle = Inner; + std::atomic_thread_fence(std::memory_order_release); #endif } @@ -170,12 +171,13 @@ Event::Set() #if ZEN_USE_WINDOWS_EVENTS SetEvent(m_EventHandle); #else - auto* Inner = (EventInner*)m_EventHandle; + std::atomic_thread_fence(std::memory_order_acquire); + auto* Inner = (EventInner*)m_EventHandle; { std::unique_lock Lock(Inner->Mutex); Inner->bSet.store(true); + Inner->CondVar.notify_all(); } - Inner->CondVar.notify_all(); #endif } @@ -185,6 +187,7 @@ Event::Reset() #if ZEN_USE_WINDOWS_EVENTS ResetEvent(m_EventHandle); #else + std::atomic_thread_fence(std::memory_order_acquire); auto* Inner = (EventInner*)m_EventHandle; { std::unique_lock Lock(Inner->Mutex); @@ -198,15 +201,18 @@ Event::Close() { #if ZEN_USE_WINDOWS_EVENTS CloseHandle(m_EventHandle); + m_EventHandle = nullptr; #else + std::atomic_thread_fence(std::memory_order_acquire); auto* Inner = (EventInner*)m_EventHandle; { std::unique_lock Lock(Inner->Mutex); Inner->bSet.store(true); } + m_EventHandle = nullptr; + std::atomic_thread_fence(std::memory_order_release); delete Inner; #endif - m_EventHandle = nullptr; } bool @@ -226,6 +232,7 @@ Event::Wait(int TimeoutMs) return (Result == WAIT_OBJECT_0); #else + std::atomic_thread_fence(std::memory_order_acquire); auto* Inner = reinterpret_cast<EventInner*>(m_EventHandle); if (Inner->bSet.load()) |