[core] Fix ThreadPool race condition (#6388)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user