由pthread_create引起的段错误
一般线程的结束是由进程内的其他线程来结束的,调用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引起的段错误的更多相关文章
- C&C++——段错误(Segmentation fault)
C/C++中的段错误(Segmentation fault) Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的.来自:http://o ...
- android出现段错误时的查找定位的方法
android出现段错误时的查找方法,例如出现log: - ::): Fatal signal (SIGSEGV) at ), thread (SurfaceFlinger) - ::): *** * ...
- C/C++中的段错误(Segmentation fault)[转]
Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的. 来自:http://oss.lzu.edu.cn/blog/article.php ...
- linux Segmentation faults 段错误详解
什么是段错误 下面是来自 Answers.com 的定义: A segmentation fault (often shortened to segfault) is a particular err ...
- 【转】段错误调试神器 - Core Dump详解
from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...
- linux下cp覆盖原so文件时引起的段错误原因确定
原创作品,转载请注明出处http://www.cnblogs.com/leo0000/p/5694416.html 最近因为一个很有意思的段错误学习了一些新的东西. 当时现象是这样的,程序正在运行,系 ...
- ubuntu segmentation fault 段错误
1.段错误 http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 2.段错误的调试方法 2.1使用printf输出信息 2 ...
- Linux环境下段错误的产生原因及调试方法小结(转)
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...
- linux Ubuntu(Segmentation fault)段错误出现原因及调试方法
在linux下编译了一个程序,尝试运行的时候出现: Segmentation fault (core dumped) 初步确认为...完全不知道是什么玩意. 于是找度娘了. ----------- ...
随机推荐
- 什么是 WSGI -- Python 中的 “CGI” 接口简介
今天在 git.oschina 的首页上看到他们推出演示平台,其中,Python 的演示平台支持 WSGI 接口的应用.虽然,这个演示平台连它自己提供的示例都跑不起来,但是,它还是成功的勾起了我对 W ...
- Groupby - collection processing
Groupby - collection processing Iterator and Iterable have most of the most useful methods when deal ...
- 全栈必备 Linux 基础
Linux 几乎无处不在,不论是服务器构建,还是客户端开发,操作系统的基础技能对全栈来说都是必备的.系统的选择Linux发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行 ...
- iOS - 全屏滑动
取经地址 1.使用关联 关联是指把两个对象相互关联起来,使得其中的一个对象作为另一个对象的一部分. 使用关联,是基于关键字的,因此,我们可以为任意对象增加任意多的关联,但是关键字是唯一的.关联可以保证 ...
- 各种编码UNICODE、UTF-8、ASCII学习笔记
本文转自csdn博客:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html ,感谢作者的分享 作者: 阮一峰 日期: ...
- Pyhton 单行、多行注释符号使用方法及规范
一.单行注释符号 # 用作单行注释符号. print 1 #输出1 二.多行注释符号 多行注释是用三引号''' '''包含. ''' 用于解析所有从网页上保存下来的页面(html) ...
- hibernate----(Hql)另一种查询---利用Criteria类
package com.etc.test; import java.util.List; import org.hibernate.Criteria;import org.hibernate.Sess ...
- mysql数据库创建函数过程
1.创建mysql数据库的存储过程,语句 2.选择执行创建的数据库存储过程即可
- jQuery $.fn 方法扩展~
//以下代码紧跟在引进的jquery.js代码后面 <script type="Text/JavaScript"> $(function (){ //扩展myName方 ...
- 获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址(服务器端)
<?php class GetMacAddr{ var $return_array = array(); // 返回带有MAC地址的字串数组 var $mac_addr; function Ge ...