Commit 50c3456f authored by tqcq's avatar tqcq
Browse files

fix thread pool can't exit

parent 1eb66fb4
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ ThreadPool::ThreadPool(int num_threads) : delayed_thread_(sled::Thread::Create()
    auto state = std::make_shared<State>();
    for (int i = 0; i < num_threads; i++) {
        threads_.emplace_back(std::thread([state] {
            state->idle++;
            state->idle.fetch_add(1, std::memory_order_relaxed);
            while (state->is_running) {
                std::function<void()> task;
                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;
                        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 (task) {
                    state->idle--;
                    state->idle.fetch_sub(1, std::memory_order_release);
                    try {
                        task();
                    } catch (const std::exception &e) {
@@ -37,7 +43,7 @@ ThreadPool::ThreadPool(int num_threads) : delayed_thread_(sled::Thread::Create()
                    } catch (...) {
                        LOGE(kTag, "ThreadPool::ThreadPool() task unknown exception, from={}", loc.ToString());
                    }
                    state->idle++;
                    state->idle.fetch_add(1, std::memory_order_relaxed);
                }
            }
        }));