zoukankan      html  css  js  c++  java
  • 由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返回原先的属性

  • 相关阅读:
    Spring中配置和读取多个Properties文件
    python 数据清洗
    python excel 文件合并
    Pandas -- Merge,join and concatenate
    python 数据合并
    python pandas
    python Numpy
    EXCEL 导入 R 的几种方法 R—readr和readxl包
    R语言笔记完整版
    第十三章 多项式回归分析
  • 原文地址:https://www.cnblogs.com/leo0000/p/5477794.html
Copyright © 2011-2022 走看看