修复并发修改线程池pending状态的问题
This commit is contained in:
@ -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);
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user