void * ThreadPool::TerminalCheck(void* arg) { Thread * thread = (Thread*)arg; if(NULL == thread || NULL == thread->m_pool) { return NULL; } ThreadPool * pool = thread->m_pool; while((false == pool->GetStop()) || pool->TotalThreads() >0 ) { pool->SendSignal(); usleep(IDLE_CHECK_POLL_EMPTY); } //pool->TerminalCondSignal(); return 0; }
void * ThreadPool::WapperFun(void*arg) { Thread * thread = (Thread*)arg; if(NULL == thread || NULL == thread->m_pool) { return NULL; } ThreadPool * pool = thread->m_pool; pool->IncreaseTotalNum(); struct timespec abstime; memset(&abstime, 0, sizeof(abstime)); while(1) { if(0 != thread->task.fun) { thread->task.fun(thread->task.data); } if( true == pool->GetStop() ) { break; //确定当前任务执行完毕后再判定是否退出线程 } pthread_mutex_lock( &thread->m_mutex ); pool->SaveIdleThread(thread); //将线程加入到空闲队列中 abstime.tv_sec = time(0) + THREAD_WAIT_TIME_OUT; abstime.tv_nsec = 0; if(ETIMEDOUT == pthread_cond_timedwait( &thread->m_cond, &thread->m_mutex, &abstime )) //等待线程被唤醒 或超时自动退出 { pthread_mutex_unlock( &thread->m_mutex ); break; } pthread_mutex_unlock( &thread->m_mutex ); } pool->LockMutex(); pool->DecreaseTotalNum(); if(thread != NULL) { pool->RemoveThread(thread); delete thread; thread = NULL; } pool->UnlockMutex(); return 0; }