From c1b0934f72a684d08361fc03dfe65820d1f5b948 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 10 Sep 2019 18:56:53 +0300 Subject: [PATCH] Simplify thread_base::join() Use waitable atomics --- Utilities/Thread.cpp | 15 ++++----------- Utilities/Thread.h | 3 --- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index e2224deefa..d9b244920f 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -1766,8 +1766,7 @@ bool thread_base::finalize(int) noexcept const bool result = m_state.exchange(thread_state::finished) == thread_state::detached; // Signal waiting threads - m_mutex.lock_unlock(); - m_jcv.notify_all(); + m_state.notify_all(); return result; } @@ -1845,16 +1844,10 @@ thread_base::~thread_base() void thread_base::join() const { - if (m_state == thread_state::finished) + for (auto state = m_state.load(); state != thread_state::finished;) { - return; - } - - std::unique_lock lock(m_mutex); - - while (m_state != thread_state::finished) - { - m_jcv.wait(lock); + m_state.wait(state); + state = m_state; } } diff --git a/Utilities/Thread.h b/Utilities/Thread.h index c8ea405388..f3cf11a9cb 100644 --- a/Utilities/Thread.h +++ b/Utilities/Thread.h @@ -124,9 +124,6 @@ class thread_base // Thread flags atomic_t m_signal{0}; - // Thread joining condition variable - mutable cond_variable m_jcv; - // Thread state atomic_t m_state = thread_state::created;