linux杀死所有线程命令,Linux:结束线程的三种方式

一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。

pthread_cancel函数

杀死(取消)线程            其作用,对应进程中 kill() 函数。

int pthread_cancel(pthread_t thread);    成功:0;失败:错误号

【注意】:线程的取消并不是实时的,而有一定的延时。需要等待线程到达某个取消点(检查点)。

类似于玩游戏存档,必须到达指定的场所(存档点,如:客栈、仓库、城里等)才能存储进度。杀死线程也不是立刻就能完成,必须要到达取消点。

取消点:是线程检查是否被取消,并按请求进行动作的一个位置。通常是一些系统调用creat,open,pause,close,read,write..... 执行命令man 7 pthreads可以查看具备这些取消点的系统调用列表。也可参阅 APUE.12.7 取消选项小节。

可粗略认为一个系统调用(进入内核)即为一个取消点。如线程中没有取消点,可以通过调用pthread_testcancel()函数自行设置一个取消点。

被取消的线程,    退出值定义在Linux的pthread库中。常数PTHREAD_CANCELED的值是-1。可在头文件pthread.h中找到它的定义:#define PTHREAD_CANCELED ((void *) -1)。因此当我们对一个已经被取消的线程使用pthread_join回收时,得到的返回值为-1。

【练习】:终止线程的三种方法。注意"取消点"的概念。                                    【pthrd_endof3.c】

终止线程方式

总结:终止某个线程而不终止整个进程,有三种方法:

从线程主函数return。这种方法对主控线程不适用,从main函数return相当于调用exit。

一个线程可以调用pthread_cancel终止同一进程中的另一个线程。

线程可以调用pthread_exit终止自己。

pthread_equal函数

比较两个线程ID是否相等。

int pthread_equal(pthread_t t1, pthread_t t2);

有可能Linux在未来线程ID pthread_t 类型被修改为结构体实现。

控制原语对比

进程            线程

fork            pthread_create

exit            pthread_exit

wait            pthread_join

kill            pthread_cancel

getpid        pthread_self        命名空间

接下来看代码:

#include

#include

#include

void*func1(void* f1)

{

puts("我是第一个线程!我采用return的方式结束自己。");

return(void*)770880;

}

void*func2(void* f2)

{

puts("我是第二个线程!我采用pthread_exit的方式结束自己。");

pthread_exit((void*)1314);

}

void*func3(void* f3)

{

puts("我是第三个线程!我采用pthread_cancel的方式结束自己。");

while(1)//可能会发生线程执行完但是主线程还没有开始调用pthread_cancel函数。

pthread_testcancel();//主动设置取消点

return(void*)520;

}

intmain(void)

{

pthread_tpth[3];

void*i;

pthread_create((pth + 0), NULL, func1, NULL);

pthread_join(pth[0], (void**)&i);

printf("线程一的退出状态:i = %d.\n", (int)i);

pthread_create((pth + 1), NULL, func2, NULL);

pthread_join(pth[1], (void**)&i);

printf("线程二的退出状态:i = %d.\n", (int)i);

pthread_create((pth + 2), NULL, func3, NULL);

pthread_cancel(pth[2]);//杀死

pthread_join(pth[2], (void**)&i);

printf("线程三的退出状态:i = %d.\n", (int)i);

return0;

}

结果:

155e04fd4b475ee107232ea5e1cc423e.png

很简单,就这样吧。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值