From cfd070c4e0eed92737794dfcf7620393fcf25537 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 20 Sep 2016 07:48:49 -0700 Subject: [PATCH] [core] Fix ThreadPool race condition (#6388) --- src/mbgl/actor/thread_pool.cpp | 17 ++++++++++++----- src/mbgl/actor/thread_pool.hpp | 3 +-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/mbgl/actor/thread_pool.cpp b/src/mbgl/actor/thread_pool.cpp index 89ca1b72f..2995ed26a 100644 --- a/src/mbgl/actor/thread_pool.cpp +++ b/src/mbgl/actor/thread_pool.cpp @@ -11,10 +11,10 @@ ThreadPool::ThreadPool(std::size_t count) { std::unique_lock lock(mutex); cv.wait(lock, [this] { - return !queue.empty() || terminate.load(); + return !queue.empty() || terminate; }); - if (terminate.load()) { + if (terminate) { return; } @@ -31,7 +31,11 @@ ThreadPool::ThreadPool(std::size_t count) { } ThreadPool::~ThreadPool() { - terminate.store(true); + { + std::lock_guard lock(mutex); + terminate = true; + } + cv.notify_all(); for (auto& thread : threads) { @@ -40,8 +44,11 @@ ThreadPool::~ThreadPool() { } void ThreadPool::schedule(std::weak_ptr mailbox) { - std::lock_guard lock(mutex); - queue.push(mailbox); + { + std::lock_guard lock(mutex); + queue.push(mailbox); + } + cv.notify_one(); } diff --git a/src/mbgl/actor/thread_pool.hpp b/src/mbgl/actor/thread_pool.hpp index 7e0b40f4e..a14d16d77 100644 --- a/src/mbgl/actor/thread_pool.hpp +++ b/src/mbgl/actor/thread_pool.hpp @@ -2,7 +2,6 @@ #include -#include #include #include #include @@ -22,7 +21,7 @@ private: std::queue> queue; std::mutex mutex; std::condition_variable cv; - std::atomic_bool terminate { false }; + bool terminate { false }; }; } // namespace mbgl