当前位置: 技术问答>linux和unix
【求助】在主线程里如何终止子线程的执行?
来源: 互联网 发布时间:2015-12-12
本文导语: 示例代码如下: #include #include #include #include void* func(void *) { while (1) { ; } return NULL; } int main(int argc, char *argv[]) { pthread_t thrd; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD...
示例代码如下:
#include
#include
#include
#include
void* func(void *)
{
while (1)
{
;
}
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t thrd;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if ( pthread_create(&thrd, &attr, func, NULL) )
{
perror("pthread_create error");
exit(EXIT_FAILURE);
}
if ( !pthread_cancel(thrd) )
{
printf( "pthread_cancel OKn" );
}
sleep( 10 );
return 0;
}
//pthread_cancel执行成功了,但是子线程仍然在内存里运行,请问这是为什么呢?
#include
#include
#include
#include
void* func(void *)
{
while (1)
{
;
}
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t thrd;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if ( pthread_create(&thrd, &attr, func, NULL) )
{
perror("pthread_create error");
exit(EXIT_FAILURE);
}
if ( !pthread_cancel(thrd) )
{
printf( "pthread_cancel OKn" );
}
sleep( 10 );
return 0;
}
//pthread_cancel执行成功了,但是子线程仍然在内存里运行,请问这是为什么呢?
|
很多POSIX多线程标准函数在LINUX上不被支持,你仔细查一下这个函数在LINUX上是否被支持!!!!!
|
LINUX上有直接杀死子线程的函数么?
我记得是无。。。。。。楼主仔细查下
我记得是无。。。。。。楼主仔细查下
|
看看pthread_cancel的man,这个函数是在一些等待函数中才能中断的。
你把while(1){;}当中改成sleep(1)看看。
你把while(1){;}当中改成sleep(1)看看。
|
只能使用pthread_cancle.
如果强制杀掉的话,这个线程里的资源谁去释放?如果有互斥锁话就有可能造成死锁。
如果强制杀掉的话,这个线程里的资源谁去释放?如果有互斥锁话就有可能造成死锁。
|
是因为这样的!
在posix thread中线程有两中取消状态:立即取消和延迟取消
立即取消就是pthread_cancel之后,不管理线程在干什么,马上终止这个线程
而延迟取消是在pthread_cancel之后,线程会继续运行,直到遇到一个"取消点函数"
系统默认的是延迟取消
象在你的这个线程中,根本就没有取消点函数,所以你这个线程是不会结束的.
如果想要结束线程有几个方法
1.不线程设置为立即取消
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
2.在你的线程中加入一些取消点函数的调用
while( 1 )
{
//sleep(1)或者pthread_testcancle();
}
在posix thread中线程有两中取消状态:立即取消和延迟取消
立即取消就是pthread_cancel之后,不管理线程在干什么,马上终止这个线程
而延迟取消是在pthread_cancel之后,线程会继续运行,直到遇到一个"取消点函数"
系统默认的是延迟取消
象在你的这个线程中,根本就没有取消点函数,所以你这个线程是不会结束的.
如果想要结束线程有几个方法
1.不线程设置为立即取消
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
2.在你的线程中加入一些取消点函数的调用
while( 1 )
{
//sleep(1)或者pthread_testcancle();
}