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

  • 相关阅读:
    Pods
    CentOS 7中firewall防火墙详解和配置以及切换为iptables防火墙
    windows IIS安装php服务及配置
    Linux最常用命令
    kubernetes 基本概念和资源对象汇总
    mysql集群压测
    mysql碰到的问题总结
    python字符串常用内建函数总结
    kubeadm常见报错和解决方法
    ubuntu部署kubeadm1.13.1高可用
  • 原文地址:https://www.cnblogs.com/leo0000/p/5477794.html
Copyright © 2011-2022 走看看