【求助】在主线程里如何终止子线程的执行?

dongpy 2006-08-22 06:18:01
示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

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 OK\n" );
}

sleep( 10 );
return 0;
}

//pthread_cancel执行成功了,但是子线程仍然在内存里运行,请问这是为什么呢?
...全文
4034 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongpy 2006-09-06
  • 打赏
  • 举报
回复
to bcb_alone(孤心):

pthread_cancel绝对不可能杀掉运行中的线程,必须被挂起时才行

这个我是测试过很多次的,通过ps命令查看运行中的线程得知的。
bcb_alone 2006-09-05
  • 打赏
  • 举报
回复
楼主,
pthread_cancel绝对不可能杀掉运行中的线程,必须被挂起时才行

为什么不行?请举例.还有请解释我的程序哪里属于挂起的部分.
把你代码写出来.
DanXer 2006-08-31
  • 打赏
  • 举报
回复
pthread_kill(pthread_t thread, int signo);
kill命令你会用吧,和它是一样的,发个9过去。需要指定线程thread
bcb_alone 2006-08-31
  • 打赏
  • 举报
回复
可以的呀!
把thread()中的sleep(3) 去掉.
也可以杀掉的. 我试过了.不知道楼主到底想要什么.

void *thread(void* m)
{
pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL); //允许退出线程
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); //设置立即取消
unsigned long t,id;
t = *(unsigned long *)m;
while(1)
{
printf("thread %d\n",t); //打印哪个线程
//sleep(3);
}
}

这种是死循环吧!
dongpy 2006-08-31
  • 打赏
  • 举报
回复
阻塞后挂起的线程,当然是可以直接杀掉的。

现在的问题是,子线程不可能被阻塞,不可能挂起,因为进入死循环了,在这种情况下,要求主线程杀掉子线程的。
fytzzh 2006-08-31
  • 打赏
  • 举报
回复
用进程不就解决问题了么!!!
直接kill不会任何后顾之忧.
有线程最担心的就是资源释放问题.
bcb_alone 2006-08-31
  • 打赏
  • 举报
回复
yym314(小鸟)的说法是正确的:

#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void *thread(void* m)
{
pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL); //允许退出线程
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); //设置立即取消
unsigned long t,id;
t = *(unsigned long *)m;
while(1)
{
printf("thread %d\n",t); //打印哪个线程
sleep(3);
}
}

main()
{
pthread_t t;
pthread_attr_t at;
int ret;
for(int i = 0; i < 2;i++)
{
ret = pthread_create(&t,NULL,thread,&i);
if(ret!=0)
{
printf ("Create pthread error!n");
exit (1);
}

}
while(1){
sleep(10);
pthread_cancel(t); //10钞钟后,取消第二个线程. t是第二个线程
}
}
dongpy 2006-08-31
  • 打赏
  • 举报
回复
to bcb_alone(孤心):

pthread_cancel绝对不可能杀掉运行中的线程,必须被挂起时才行~

虽然pthread_cancel是成功返回的,但是目标线程仍旧在内存中运行着~


to Ropyn(剑心):
你说的方法倒是可以直接杀死子线程,但是把主线程也一起杀死了,好像是进程直接退出了。


fytzzh 2006-08-30
  • 打赏
  • 举报
回复
如果非要使用线程的话,当然也可以在线程里使用exec、fork。不过要小心使用。
fytzzh 2006-08-30
  • 打赏
  • 举报
回复
我觉的你的这种需求在线程里做很危险:
1, 在一个线程里执行第三方函数,如果终止该线程的话,只能使用pthread_cancel和pthread_kill,这样都 要求第三方函数提供相应的接口.不太现实.
2, 如果强制终止该线程,对于主线程程序来讲这样很危险,第三方函数里的需要释放的资源都没有机会释放,会造成程序的不稳定.

所以楼主可以使用多进程来实现.这样就没有那么多的顾虑了.
dongpy 2006-08-30
  • 打赏
  • 举报
回复
Up~
dongpy 2006-08-29
  • 打赏
  • 举报
回复
要杀死这个运行中的线程,还是没辙。

因为需求是这样的:

在子线程执行用户编写的一些操作,举个简单例子:

void doWork()
{
while (1)
{
;
}
}

void* func(void *)
{
doWork();
return NULL;
}

/////.........(主线程省略,如楼顶所示)

//这只是一个示例(实际中用户的代码是以dll的方式加载的)。
//doWork是用户需要执行的操作(五花八门,很可能会有死循环在里面)。
//func是由主线程创建,用于执行用户的操作。

//问题是:当doWork死循环时,主线程如何杀死子线程func。

###目前看来,直接杀死没有挂起的线程是不太可能了。能不能让运行中的线程先挂起,然后杀掉呢?

yym314 2006-08-25
  • 打赏
  • 举报
回复
是因为这样的!
在posix thread中线程有两中取消状态:立即取消和延迟取消
立即取消就是pthread_cancel之后,不管理线程在干什么,马上终止这个线程
而延迟取消是在pthread_cancel之后,线程会继续运行,直到遇到一个"取消点函数"
系统默认的是延迟取消

象在你的这个线程中,根本就没有取消点函数,所以你这个线程是不会结束的.

如果想要结束线程有几个方法
1.不线程设置为立即取消
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
2.在你的线程中加入一些取消点函数的调用
while( 1 )
{
//sleep(1)或者pthread_testcancle();
}


fytzzh 2006-08-25
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

void* func(void *arg)
{
while (1)
{
pthread_testcancel(); ===》在这里增加测试点
}
return NULL;
}

int main(int argc, char *argv[])
{
pthread_t thrd;

//为了查看是否已经被取消了,我们用pthread_join来取线程的退出状态。
//pthread_attr_t attr;
//pthread_attr_init(&attr);
//pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
void *result;
int status;

if ( pthread_create(&thrd, /*&attr*/NULL, func, NULL) )
{
perror("pthread_create error");
exit(EXIT_FAILURE);
}

if ( !pthread_cancel(thrd) )
{
printf( "pthread_cancel OK\n" );
}

status = pthread_join(thrd, &result);
if (status != 0)
{
return -1;
}
if (result == PTHREAD_CANCELED)
{
printf("Thread canceled!\n");//如果线程是被取消的,回打印。
}
else
return -2;

sleep( 10 );
return 0;
}
[zhanghua@melon csdn]$ ./pthread_cancle2
pthread_cancel OK
Thread canceled!

打印了Thread canceled! 说明线程已经被取消成功。

fytzzh 2006-08-25
  • 打赏
  • 举报
回复
只能使用pthread_cancle.
如果强制杀掉的话,这个线程里的资源谁去释放?如果有互斥锁话就有可能造成死锁。
dongpy 2006-08-25
  • 打赏
  • 举报
回复
试了好些方法,都未成功。

可能是不支持杀掉正在运行的线程,线程只能在挂起时被杀掉。
linuxpgy 2006-08-24
  • 打赏
  • 举报
回复
terminatethread函数(名字我记不清了),好象可以
fytzzh 2006-08-24
  • 打赏
  • 举报
回复
>>>谢谢楼上各位~
>>>
>>>是这样的,在主线程里创建一个执行线程,执行一些操作,这些操作有可能是死循环,这时>>>主线程就要负责杀死这个执行线程,请问能不能实现呢?

使用 #include <pthread.h>

int pthread_cancel(pthread_t thread);
Randy_lu 2006-08-24
  • 打赏
  • 举报
回复
在线程函数里增加这样两条语句
//收到cancel信号后设为cancle态
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);

//收到cancel信号后立即退出
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
或增加
pthread_testcancle();
pacman2000 2006-08-23
  • 打赏
  • 举报
回复
不要做完全的死循环。至少得有阻塞式的read,write,或者usleep(100)这样的间隙函数。
不然,一个死循环不是狂耗CPU资源吗。。。
加载更多回复(10)

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧