[core] Fix ThreadPool race condition (#6388)

This commit is contained in:
John Firebaugh
2016-09-20 07:48:49 -07:00
committed by GitHub
parent c3a583cdd5
commit cfd070c4e0
2 changed files with 13 additions and 7 deletions

View File

@@ -11,10 +11,10 @@ ThreadPool::ThreadPool(std::size_t count) {
std::unique_lock<std::mutex> 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<std::mutex> lock(mutex);
terminate = true;
}
cv.notify_all();
for (auto& thread : threads) {
@@ -40,8 +44,11 @@ ThreadPool::~ThreadPool() {
}
void ThreadPool::schedule(std::weak_ptr<Mailbox> mailbox) {
std::lock_guard<std::mutex> lock(mutex);
queue.push(mailbox);
{
std::lock_guard<std::mutex> lock(mutex);
queue.push(mailbox);
}
cv.notify_one();
}

View File

@@ -2,7 +2,6 @@
#include <mbgl/actor/scheduler.hpp>
#include <atomic>
#include <condition_variable>
#include <mutex>
#include <queue>
@@ -22,7 +21,7 @@ private:
std::queue<std::weak_ptr<Mailbox>> queue;
std::mutex mutex;
std::condition_variable cv;
std::atomic_bool terminate { false };
bool terminate { false };
};
} // namespace mbgl