From e2534061ded54200d8072d5e6f6e6a181004afb8 Mon Sep 17 00:00:00 2001 From: chenxiaobin19 <1025221611@qq.com> Date: Wed, 11 Oct 2023 11:05:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B9=B6=E5=8F=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=BA=BF=E7=A8=8B=E6=B1=A0pending=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/process/threadpool/threadpool_worker.cpp | 6 +++++- src/include/threadpool/threadpool_worker.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gausskernel/process/threadpool/threadpool_worker.cpp b/src/gausskernel/process/threadpool/threadpool_worker.cpp index 43c58ae3a..6bc341d32 100644 --- a/src/gausskernel/process/threadpool/threadpool_worker.cpp +++ b/src/gausskernel/process/threadpool/threadpool_worker.cpp @@ -82,6 +82,7 @@ ThreadPoolWorker::ThreadPoolWorker(uint idx, ThreadPoolGroup* group, pthread_mut m_group = group; m_tid = InvalidTid; m_threadStatus = THREAD_UNINIT; + m_thrd_idle_waiting = false; m_currentSession = NULL; m_mutex = mutex; m_cond = cond; @@ -280,7 +281,8 @@ bool ThreadPoolWorker::WakeUpToPendingIfFree() { bool ans = false; pthread_mutex_lock(m_mutex); - if (m_threadStatus != THREAD_EXIT && m_threadStatus != THREAD_PENDING && m_currentSession == NULL) { + if (m_threadStatus != THREAD_EXIT && m_threadStatus != THREAD_PENDING && m_currentSession == NULL && + m_thrd_idle_waiting) { m_threadStatus = THREAD_PENDING; pthread_cond_signal(m_cond); ans = true; @@ -439,7 +441,9 @@ void ThreadPoolWorker::WaitNextSession() if (unlikely(m_threadStatus == THREAD_PENDING || m_threadStatus == THREAD_EXIT)) { break; } + m_thrd_idle_waiting = true; pthread_cond_wait(m_cond, m_mutex); + m_thrd_idle_waiting = false; } pthread_mutex_unlock(m_mutex); m_group->GetListener()->RemoveWorkerFromList(this); diff --git a/src/include/threadpool/threadpool_worker.h b/src/include/threadpool/threadpool_worker.h index f2ca99158..d17abedc7 100644 --- a/src/include/threadpool/threadpool_worker.h +++ b/src/include/threadpool/threadpool_worker.h @@ -145,6 +145,7 @@ private: uint m_idx; knl_session_context* m_currentSession; volatile ThreadStatus m_threadStatus; + bool m_thrd_idle_waiting; ThreadStayReason m_reason; Dlelem m_elem; ThreadPoolGroup* m_group;