1、线程结束的方式

  • (1)线程函数中调用pthread_exit函数,不会导致对象析构,可以使用
  • (2)线程所属的进程结束,进程调用exit,线程C++对象不会销毁,不安全,属于被动结束
  • (3)线程函数执行返回return,好的退出方式
  • (4)线程被同一进程或其他线程通知结束,属于被动结束

2、线程主动结束

线程主动结束使用return或者pthread_exit函数,原型如下:

void pthread_exit(void *retval);

retval是线程返回给主线程的值,线程函数返类型是void *。在main线程中调用pthread_exit(NULL)将结束main线程,但是进程不立即退出。

示例:

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>void thread_fun(void *arg)
{static int count = 1;//必须静态,传出的地址不改变pthread_exit((void*)&count);
}
int main(int argc,char * argv[])
{int *pretv;int pid;if(0 != pthread_creat(&pid,NULL,(void *(*)(void *))thread_fun,NULL)){printf("pthread creat error\n");return -1;}pthread_join(pid,(void**)&pretv);printf("thread fun retval:%d\n",*pretv);return 0;
}

3、线程被动结束

线程被动结束的两种方法:

  • 同一进程的其他线程中通过函数pthread_kill发送信号给要结束的进程,目标进程收到后再退出
  • 同一进程的其他线程中通过函数pthread_cancel取消目标的执行

pthread_kill的函数原型:

void pthread_kill(pthread_t pid, int signal);

pid:接收信号线程的线程ID;signal就是信号,大于0的值,如果等于0就是探测线程是否存在,执行成功返回0,否则返回错误码,ESRCH线程不存在,EINVAL信号不合法。

向指定线程发送信号,如果线程代码不处理,则调用信号的默认处理方法。线程信号例如:Linux 进程通信 -- 信号

https://blog.csdn.net/u010058695/article/details/102787168

pthread_cancel的函数原型:

void pthread_cancel(pthread_t pid);

pid:要被取消线程的ID,向指定线程发送取消执行的请求,请求终止,但不一定就终止,系统不会马上取消线程,只有在被取消线程下次调用一些C库函数如printf或者pthread_testcancel(让内核去检测是否需要取消当前线程)时,才会真正结束,在线程执行过程中检测是否有未响应取消信号的地方叫做取消点。

示例:

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>void thread_fun(void *arg)
{int count = 0;while(1){i++;pthread_testcancel();}return;
}
int main(int argc,char * argv[])
{int *pretv;int pid;if(0 != pthread_creat(&pid,NULL,(void *(*)(void *))thread_fun,NULL)){printf("pthread creat error\n");return -1;}pthread_cancel(pid);pthread_join(pid,(void**)&pretv);return 0;
}

Linux 多线程开发-线程的结束pthread_kill和pthread_cancel相关推荐

  1. Linux 多线程开发-线程的属性-分离detached和连接joinable

    1.描述 linux的POSIX线程分离状态决定一个线程以什么方式来终止.默认的分离状态是可连接态(joinable),创建线程是参数设置为NULL,就是默认连接态,可以被pthread_join. ...

  2. Linux多线程开发-线程同步-条件变量pthread_cond_t

    1.条件变量的概念 一个线程A的执行需要另一个线程B来唤醒,否则A挂起等待.线程B可以产生线程A继续执行的信号.条件变量常用在共享数据状态变化的场景中,例如:生产则和消费者问题.POSIX线程库提供了 ...

  3. Linux多线程开发-线程同步-读写锁pthread_rwlock_t

    1.读写锁概念 对资源的访问抽象为两种类型,即独占和共享.独占资源具有排他性,例如写操作.共享资源可以同时由多个线程访问,不对该资源执行写操作.针对资源的读和写操作分别加锁,写操作加锁与互斥锁相同,但 ...

  4. Linux多线程开发-线程同步-互斥锁pthread_mutex_t

    1.互斥锁 同一时刻只允许一个线程对临界区进行访问.POSIX库中用类型pthread_mutex_t来定义互斥锁,类型在pthreadtypes.h中定义. 2.如何声明一个互斥锁 #include ...

  5. Linux 多线程开发-线程创建pthread_creat

    1.函数原型 int pthread_creat(pthread_t *pid, const pthread_attr_t *attr,void *(*start_routine)(void *),v ...

  6. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  7. 3、Linux多线程,线程同步(转)

    3.Linux多线程,线程同步 5)线程私有数据 进程内的所有线程共享进程的数据空间,因此全局变量为所有线程所共有.但有时线程也需要保存自己的私有数据,这时可以创建线程私有数据(Thread-spec ...

  8. Linux 多线程开发-等待线程结束pthread_join

    1.函数原型 int pthread_join(pthread_t pid, void **value_ptr); pid:所等待的线程ID: value_ptr:通常设置为NULL,如果不为NULL ...

  9. Linux 多线程开发(附有案例代码)

    一.线程概述 1.线程概念 与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机制.一个进程可以包含多个线程.同一个程序中的所有线程均会独立执行相同程序,且共享同一 ...

最新文章

  1. Excel实用小技巧
  2. 针对ASP.NET Core Web API的先进架构
  3. java reflection list_Java Reflection(九):泛型
  4. Ubuntu系统如何安装软件
  5. ActiveMQ入门-ActiveMQ跟SpringBoot整合发送接收Queue
  6. cxf发布rest风格的webService
  7. java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法
  8. 信息学奥赛一本通 2045:【例5.13】蛇形填数
  9. 第7章 聚类分析及R使用
  10. Ubuntu 11.04 下安装配置 JDK 7
  11. jdk String类源码解析
  12. pandas获取某行数据
  13. 技巧积累篇--Dashboard使用技巧
  14. 遥感图像预处理—步骤
  15. 基于JavaWeb的新闻发布管理系统设计与实现 毕业论文+任务书+开题报告+答辩PPT+项目源码及数据库文件
  16. 常见路由器默认登录用户名和密码(大全)
  17. 《tensorflow实战》6——强化学习之策略网络
  18. 清华大学、北京大学毕业生的去向
  19. 【二 HLS】HLS接口的简单介绍
  20. mysql biginteger java_java.math.BigInteger cannot be cast to java.lang.Integer以及mysql升级的问题...

热门文章

  1. BI Publisher开发基本流程
  2. mysql时间区间效率_对于sql中使用to_timestamp判断时间区间和不使用的效率对比及结论...
  3. java中的string是什么_什么是String
  4. ecs服务器数据迁移_如何非常方便地从Windows文件服务器把数据完整地迁移到ONTAP Select...
  5. 更新和插入的并发问题_mysql经典面试题:如何读写分离?主从原理是啥?同步的延时问题...
  6. 用同一uuid作为两个字段的值_这两个小技巧,让SQL语句不仅躲了坑,还提升了 1000 倍...
  7. 由Qt中qApp想到的(这是单例模式么???)
  8. 前端学习(3339):ant design中加上icon图标
  9. [html] 如何构建“弱网络环境”友好的项目?
  10. [html] 如何禁止web端的页面缩放?