fix thread pool can't exit
This commit is contained in:
parent
1eb66fb4dc
commit
50c3456f65
@ -13,7 +13,7 @@ ThreadPool::ThreadPool(int num_threads) : delayed_thread_(sled::Thread::Create()
|
|||||||
auto state = std::make_shared<State>();
|
auto state = std::make_shared<State>();
|
||||||
for (int i = 0; i < num_threads; i++) {
|
for (int i = 0; i < num_threads; i++) {
|
||||||
threads_.emplace_back(std::thread([state] {
|
threads_.emplace_back(std::thread([state] {
|
||||||
state->idle++;
|
state->idle.fetch_add(1, std::memory_order_relaxed);
|
||||||
while (state->is_running) {
|
while (state->is_running) {
|
||||||
std::function<void()> task;
|
std::function<void()> task;
|
||||||
sled::Location loc = SLED_FROM_HERE;
|
sled::Location loc = SLED_FROM_HERE;
|
||||||
@ -26,10 +26,16 @@ ThreadPool::ThreadPool(int num_threads) : delayed_thread_(sled::Thread::Create()
|
|||||||
loc = state->task_queue.front().second;
|
loc = state->task_queue.front().second;
|
||||||
state->task_queue.pop();
|
state->task_queue.pop();
|
||||||
}
|
}
|
||||||
|
// FIXME: can't exit if task add self, must check <is_running>
|
||||||
|
if (!state->is_running) {
|
||||||
|
state->idle.fetch_sub(1, std::memory_order_relaxed);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!state->task_queue.empty()) { state->cv.NotifyOne(); }
|
if (!state->task_queue.empty()) { state->cv.NotifyOne(); }
|
||||||
}
|
}
|
||||||
if (task) {
|
if (task) {
|
||||||
state->idle--;
|
state->idle.fetch_sub(1, std::memory_order_release);
|
||||||
try {
|
try {
|
||||||
task();
|
task();
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
@ -37,7 +43,7 @@ ThreadPool::ThreadPool(int num_threads) : delayed_thread_(sled::Thread::Create()
|
|||||||
} catch (...) {
|
} catch (...) {
|
||||||
LOGE(kTag, "ThreadPool::ThreadPool() task unknown exception, from={}", loc.ToString());
|
LOGE(kTag, "ThreadPool::ThreadPool() task unknown exception, from={}", loc.ToString());
|
||||||
}
|
}
|
||||||
state->idle++;
|
state->idle.fetch_add(1, std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
Loading…
Reference in New Issue
Block a user