由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返回原先的属性

posted @ 2016-05-10 14:43  __sipl  阅读(2148)  评论(0编辑  收藏  举报