c++-关于线程无法退出的问题。

问题描述

关于线程无法退出的问题。
最近写了个线程池的程序,可是在最后线程函数一直无法退出 请各路大神帮忙解答一下。由于行数比较多就不全贴出来了。
线程池实现:
析构函数:
TthreadControl::~TthreadControl(){

while( numOfWaitJobs != 0 ){    printf(""size: "" numOfWaitJobs);    //cout << ""size:"" << numOfWaitJobs << endl;    sleep(10);}printf(""m_ShutDown is falstn"");pthread_mutex_lock(&m_Mutex_lock);m_ShutDown = true;pthread_mutex_unlock(&m_Mutex_lock);printf(""m_ShutDown is truen"");printf(""before broadcastn"");//cout << ""before broadcast"" << endl;pthread_cond_broadcast( &m_cond ); //tell all thread the pool will be closed.printf(""after broadcastn"");for( int index = 0; index < qThreadID.size(); index++ ){    printf(""before joinn"");    pthread_join( *qThreadID[index] NULL );    printf(""after joinn"");}printf(""before free lock and conn"");pthread_mutex_destroy( &(m_Mutex_lock) );pthread_cond_destroy( &(m_cond) );printf(""after free lock and conn"");

}
线程函数:
void * TthreadControl::Controler( void * arg ){
TthreadControl * thread = ( TthreadControl * )arg;
pthread_t tid = pthread_self();
while( true ){
printf(""thread id:%u. in controler before lockn"" tid);
pthread_mutex_lock( &(thread->m_Mutex_lock) ); //
while ( thread->numOfWaitJobs == 0 && thread->m_ShutDown == false ) {
printf(""thread id:%u. in controler before waitn"" tid);
pthread_cond_wait( &(thread->m_cond) &(thread->m_Mutex_lock) );
printf(""thread id:%u. in controler after waitn"" tid);
}
if ( thread->m_ShutDown ) {
printf(""thread id:%u. in controler before unlock and will exitn"" tid);
pthread_mutex_unlock( &(thread->m_Mutex_lock) ); //?~W??~H?记?~O解?~T~A?~@~B
printf(""thread id:%u. in controler after unlock and will exitn"" tid);
//return NULL;
pthread_exit( NULL );
}
assert( thread->numOfWaitJobs != 0 );

    thread->numOfWaitJobs--;    threadWorker * worker = thread->qWaitjobs.at( 0 ); //?~O~V?~G?第?~@个?~E~C?| ?~@~B    thread->qWaitjobs.erase( thread->qWaitjobs.begin() );    printf(""thread id:%u. in controler before unlock and will process workern"" tid);    pthread_mutex_unlock( &(thread->m_Mutex_lock) ); //解?~T~A    printf(""thread id:%u. in controler after unlock and will process workern"" tid);    worker->m_Function( worker->m_Arg );    printf(""thread id:%u. in controler after processed workern"" tid);}

}

线程函数调用的任务函数:
void LExpandSeed( TSeed seed map * qExists double fractionOfASingleSeed long nTReadsvector * qSeed vector * faFile bool dir ){//if true extend towards left; else towards right.
char qBase[] = {'A''T''G''C'};
string rawSeq = seed.GetSeq();
vector< long > * qSupSeqOfRawSeed = seed.GetSupSeq();
pthread_t pid = pthread_self();
bool ifExtend = false;
for( int index=0; index string newSeq;
if ( dir ) {
newSeq = qBase[index]+rawSeq;
} else {
newSeq = rawSeq + qBase[index];
}
//lock
pthread_mutex_lock( &mutexOfqExist );
printf(""thread:%u locked qexistsn"" pid);
if( qExists->find(newSeq) != qExists->end() ){
ifExtend = true; // the seed has been signed.
//unlock;
printf(""thread:%u will unlocked qexistsn"" pid);
pthread_mutex_unlock( &mutexOfqExist );
printf(""thread:%u unlocked qexistsn"" pid);
continue;
}
//create a son seed.
TSeed sonSeed( newSeq.c_str() );
qExists->insert( pair(newSeq1) );
//unlock
printf(""thread:%u will unlocked qexistsn"" pid);
pthread_mutex_unlock( &mutexOfqExist );
printf(""thread:%u unlocked qexistsn"" pid);
for( int i=0; isize(); i++ ){
if ( faFile->at((*qSupSeqOfRawSeed)[i]).find(newSeq) != string::npos ) {
sonSeed.AddSupSeq( qSupSeqOfRawSeed->at(i) );
}
}
if ( (float)(sonSeed.GetSupNum())/nTReads > fractionOfASingleSeed ) {
LExpandSeed( sonSeed qExists fractionOfASingleSeed nTReads qSeed faFiledir );
ifExtend = true;
}

}if ( !ifExtend ) {    printf(""thread:%u will locked qseedn"" pid);    pthread_mutex_lock( &mutexOfRSeed );    printf(""thread:%u locked qseedn"" pid);    qSeed->push_back( seed ); // qseed 是一个vector<string>类型的向量    printf(""thread:%u will unlocked qseedn"" pid);    pthread_mutex_unlock( &mutexOfRSeed );    printf(""thread:%u unlocked qseedn"" pid);}

}

现在的具体情况是:每次调用调用析构的时候 程序都会停在pthread_exit(NULL);这个地方 无法退出, 请教各路大神这个有可能是神马情况,怎么破??

解决方案

线程函数中是否返回。然后线程才能结束
可以用wait

解决方案二:
可以用 pthread_Wait 等待线程结束.....

时间: 2024-09-28 00:59:32

c++-关于线程无法退出的问题。的相关文章

linux. 线程 异常-linux线程异常退出问题。

问题描述 linux线程异常退出问题. linux进程(多条线程),其中有一个线程死循环没有执行任何操作(长期占用CPU 99%),linux系统有没有可能会干掉这条异常线程,但是整个进程没有退出? 求大神解答,没分- 解决方案 线程问题:空指针异常linux线程异常保护Linux进程.线程问题 解决方案二: 系统会直接杀进程.而不是线程 解决方案三: 对系统来说进程是软件运行的最小单位.所以会直接kill你这个进程.除非进程知道自己命不久矣,将会导致自己gg的线程给处理掉.

UNIX环境高级编程:主线程与子线程的退出关系

我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1.  主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <sys/types.h> pthread_t ntid;//线程ID void print

线程全部退出

问题描述 各位大侠,我在用C#多线程读取串口数据时,当运行一段时间后,系统输出上百行线程退出提示,然后所有串口的数据都无法读取了,请教大家是什么原因?谢谢提示如下:(我只复制了其中的一部分提示)线程0x14ac已退出,返回值为0(0x0).线程0xf64已退出,返回值为0(0x0).线程0x1740已退出,返回值为0(0x0).线程0x133c已退出,返回值为0(0x0).线程0x154已退出,返回值为0(0x0).线程0xf8c已退出,返回值为0(0x0).线程0x163c已退出,返回值为0(

关于线程的执行和退出

线程由两部分构成: 线程内核对象:操作系统用它来对线程实施管理.内核对象也是系统用来存放线程统计信息的地方. 线程堆栈:它用于维护线程在执行代码时需要的所有函数参数和局部变量.   我们必需要知道一个事实 ----- 进程( WINDOWS 中)是不能被调度的.通常所说的调度,都是对线程而言的.进程仅仅是线程的容器,是系统统分配资源的单位. 这样,线程自身不会分配资源.同一进程中的多个线程共同使用它们父进程的资源.   一个进程至少需一个线程,如果一个进程中不存在线程(所有线程都退出).则系统认

linux多线程编程中如何等待过个线程退出

问题描述 linux多线程编程中如何等待过个线程退出 linux多线程编程中,如果线程A创建了线程B,我知道用pthread__ join可以令线程A 阻塞然后等待线程B的退出.如果线程A创建了三个线程B,C,D,执行完的先后顺序不知.想让A必须等待三个线程都退出后再退出,应该怎么做? 连用pthread__join三次吗???但是第一次用了pthread__join后,A不就阻塞了吗? 解决方案 多线程编程(一):线程创建和退出Linux多线程编程(创建线程)Linux多线程编程(创建线程)

UNIX环境高级编程:线程私有数据

线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制.   在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变量,都可以被进程内所有的线程读写. 一个线程真正拥有的唯一私有存储是处理器寄存器,栈在"主人"故意暴露给其他线程时也是共享的. 有时需要提供线程私有数据:可以跨多个函数访问(全局):仅在某个线程有效(私有)(即在线程里面是全局).例如:errno. 进程中的所有线程都可以访问进程的整个

java的线程死锁

由于线程可能进入堵塞状态,而且由于对象可能拥有"同步"方法--除非同步锁定被解除,否则线程不能访问那个对象--所以一个线程完全可能等候另一个对象,而另一个对象又在等候下一个对象,以此类推.这个"等候"链最可怕的情形就是进入封闭状态--最后那个对象等候的是第一个对象!此时,所有线程都会陷入无休止的相互等待状态,大家都动弹不得.我们将这种情况称为"死锁".尽管这种情况并非经常出现,但一旦碰到,程序的调试将变得异常艰难. 就语言本身来说,尚未直接提供防

c#线程基础之线程控制

用ManualResetEvent和AutoResetEvent可以很好的控制线程的运行和线程之间的通信.msdn的参考为: http://msdn.microsoft.com/zh-cn/library/system.threading.autoresetevent.aspx http://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent.aspx 下面我写个例子,这里模拟了一个线程更新数据,两个线程读取数据.

API之进程和线程函数

CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接 CreateEvent 创建一个事件对象 CreateMailslot 创建一个邮路.返回的句柄由邮路服务器使用(收件人) CreateMutex 创建一个互斥体(MUTEX) CreateNamedPipe 创建一个命名管道.返回的句柄由管道的服