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;