一般线程的结束是由进程内的其他线程来结束的,调用pthread_cancel.

但是需要考虑到被结束线程的性质,一方面,线程是可被结束,也可无法结束,即不响应该信号;另一方面,如果线程是可被结束的,那么结束的方式有两种,一种是同步,当线程收到这个信号的时候先挂起,等到下一个取消点时再响应该信号,另一种是异步,收到这个信号时,线程立即结束。

注意:线程默认是可被取消,同步结束。

什么是取消点?

取消点是很多的系统调用,pthread_join,write等很多系统调用,包括很多的库函数调用,printf等,因为printf中有前面所说的系统调用write。

是不是取消点我觉得可以自己做一个简单地测试。

为什么要考虑线程的性质呢?

考虑以下情况:

  父线程A和子线程B(未设置异步结束),共同访问资源C,父线程结束子线程B,但是pthread_cancel只是发送信号,接着父线程接着释放资源C,当B恢复运行时,由于不是直接结束而会等待下一个取消点,而在下一个取消点前,B访问了资源C,此时程序就会崩溃。

所以线程间的同步,要么设置子线程异步结束,或者父线程等待子线程结束的信号。

附:

  设置线程同步结束还是异步结束接口:

  

int pthread_setcanceltype(int type, int *oldtype);

type可取值异步PTHREAD_CANCEL_ASYNCHRONOUS        同步PTHREAD_CANCEL_DEFERRED   oldtype返回原先的属性

由pthread_create引起的段错误的更多相关文章

  1. C&C++——段错误(Segmentation fault)

    C/C++中的段错误(Segmentation fault) Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的.来自:http://o ...

  2. android出现段错误时的查找定位的方法

    android出现段错误时的查找方法,例如出现log: - ::): Fatal signal (SIGSEGV) at ), thread (SurfaceFlinger) - ::): *** * ...

  3. C/C++中的段错误(Segmentation fault)[转]

    Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的. 来自:http://oss.lzu.edu.cn/blog/article.php ...

  4. linux Segmentation faults 段错误详解

    什么是段错误 下面是来自 Answers.com 的定义: A segmentation fault (often shortened to segfault) is a particular err ...

  5. 【转】段错误调试神器 - Core Dump详解

    from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...

  6. linux下cp覆盖原so文件时引起的段错误原因确定

    原创作品,转载请注明出处http://www.cnblogs.com/leo0000/p/5694416.html 最近因为一个很有意思的段错误学习了一些新的东西. 当时现象是这样的,程序正在运行,系 ...

  7. ubuntu segmentation fault 段错误

    1.段错误 http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 2.段错误的调试方法 2.1使用printf输出信息 2 ...

  8. Linux环境下段错误的产生原因及调试方法小结(转)

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...

  9. linux Ubuntu(Segmentation fault)段错误出现原因及调试方法

      在linux下编译了一个程序,尝试运行的时候出现: Segmentation fault (core dumped) 初步确认为...完全不知道是什么玩意. 于是找度娘了. ----------- ...

随机推荐

  1. 洛谷P1901 发射站

    题目描述 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发射站接 ...

  2. Java unserialize serialized Object(AnnotationInvocationHandler、ysoserial) In readObject() LeadTo InvokerTransformer(Evil MethodName/Args)

    Java unserialize serialized Object(AnnotationInvocationHandler.ysoserial) In readObject() LeadTo Tra ...

  3. 多播程序设计(基于UDP协议)

    首先要搞清楚多播IP地址有哪些 D类IP地址就是多播地址,范围是224.0.0.0 ~ 239.255.255.255 其中又划分为以下类别 D类地址的划分 类别 地址范围 描述 局部链接地址(本地网 ...

  4. Centos7下搭建KVM虚拟机

    PRE-INSTALL ============================================================= kvm相关安装包及其作用 qemu-kvm 主要的K ...

  5. 数据库中Count是什么意思和SUM有什么区别?

    今天早上在做数据库的练习, 我是这样写的: 得出是: 后来才知道是: 结果是: 后来我意识到区别,于是查资料得到: 数据库中的count,是用来统计你查询出来的记录数,比如学生表中有十条记录:sele ...

  6. NXP Mifare S50标准IC卡- 访问位(Access Bits) 分析

    Mifare S50 标准IC卡有1K 字节的EEPROM,主要用来存储数据和控制信息.1K 字节的EEPROM分成16 个区,每区又分成4 段,每1段中有16 个字节.每个区的最后一个段叫“尾部&q ...

  7. 【原】React操作表单

    最近的项目中开发中都是用react,其中有用到react去操纵表单.然后自己就在每个表单元素中添加 ref,  然后再像jquery操作dom一样去操纵这个ref, 代码如下: 首先我在每个表单元素那 ...

  8. easyUI增加视图分组的办法

    1.在JSP头文件中引入如下代码 <script type="text/javascript" src="${pageContext.request.context ...

  9. Quartz.NET总结(二)CronTrigger和Cron表达式

    Quartz.NET的任务调度,主要就是依靠CronTrigger和Cron表达式.Cron是已经在UNIX存在了很长一段时间,它有着强大和可靠的调度能力.CronTrigger类也正是是基于Cron ...

  10. WindowsService 创建.安装.部署

    windows服务的用法很适合用于一些长期跑的项目..不需要人工操作..不需要服务器一直登陆..很方便.. 不说废话..直接开整.. 启动VS2012..创建Windows服务项目.. 确定..创建成 ...