在公司的某个项目中,启动了32个线程进行任务处理。其中只有3个线程真正执行了任务,其他线程都因没有任务直接退出了。在所有任务处理完成后,主线程使用phtread_kill进行线程存活检查时在Linux下会导致程序崩溃,但是在AIX下则无任何问题。(线程在执行函数中pthread_detach了)
/*检查所有线程是否已经停止,对于没有停止的发送退出消息*/
// for(i = 0; i < BATCH_CHGPWD_THREADS; ++i)// {
// nThreadID = pTaskSet->ThreadIDs[i];
// if(nThreadID <= 0)
// {
// log_str(NULL, LOG_DEBUG, "%s:%d 第[%d]个线程ID为空,继续检查下一个线程",
// __FUNCTION__, __LINE__, i);
// continue;
// }
//
// log_str(NULL, LOG_DEBUG, "%s:%d 开始检查第[%d]个线程ID=0x%x",
// __FUNCTION__, __LINE__, i, nThreadID);
// nRet = pthread_kill(nThreadID, 0); /*测试线程是否处于运行状态*/
// if(nRet == ESRCH)
// {
// log_str(NULL, LOG_DEBUG, "ID为0x%x的线程不存在或者已经退出",(unsigned int)nThreadID);
// pTaskSet->ThreadIDs[i] = 0;
// }
// else if(nRet == EINVAL)
// {
// log_str(NULL, LOG_WARN, "pthread_kill发送信号非法");
// }
// else
// {
// log_str(NULL, LOG_DEBUG, "ID为0x%x的线程目前仍然存活,向该线程发送退出消息",(unsigned int)nThreadID);
// pthread_cancel(nThreadID); /*向线程发送退出消息*/
// pTaskSet->ThreadIDs[i] = 0;
// }
//
// log_str(NULL, LOG_DEBUG, "%s:%d 第[%d]个线程检查结束", __FUNCTION__, __LINE__, i);
// }