信号安全跟线程安全函数背后本质
来源:互联网 发布:东南亚中国 知乎 编辑:程序博客网 时间:2024/05/22 16:49
原文:http://blog.csdn.net/guosha/article/details/2966609
看UNIX编程相关的书在讲信号的时候会列出一大堆的保证信号安全的函数,在讲线程的时候也会例出一些不保证线程安全的函数。需要把它们都记下来吗?我觉得太可不必,也不科学,不了解根本你很可能自己写出一个不安全的函数,然后在信号处理里或是多线程程序里使用,出了问题却莫名其妙!
一般来说如果函数内部使用了静态变量或是全局变量,或是传了引用进去的函数就不具可重入性。具体可重入函数的概念可以去百度一下。
在带信号处理的程序里,因为信号处理的异步性,所以很可能当你正在调用函数A的时候被信号打断了,当你在该信号时处理函数里又调用了函数A,这进你就重复调用了函数A,这时就你要考虑函数A是不是可重入函数。所以一个函数是否信号安全基本就跟该函数是否可重入相等。
在多线程程序里也一样,因为子线程随时可能在某个函数里被中断,然后去运行另一个线程,如果另一个线程里也恰好调用了这个函数,这样是否线程安全也同样被提出来了。
从上是否就可以得出信号安全跟线程安全就是相等了呢?事实是不一样的,要不然那些教材也不会分别把信号安全跟线程安全的函数列出来,举个简单的例子,malloc不是信号安全的,但却是线程安全的,这内部的区别在哪呢?百度一下,原来,malloc函数的内部使用了锁的机制,所以,当你如果程序里调用了malloc前在调度这个函数时被信号中断了再在信号处理函数里调用malloc的话,就有可能出现死锁。而此种情况在多线程程序里却不存在,因为第二个线程会挂起,继续运行线程1直接线程1完成malloc释放锁。
所以信号安全跟线程安全基本相同,但考虑到信号处理函数必须返回后程序才能继续,信号安全跟线程安全又稍有不同。
- 信号安全跟线程安全函数背后本质
- 信号安全跟线程安全函数背后本质
- 可重入函数、信号安全、线程安全详解
- 可重入函数、线程安全函数、异步信号安全函数
- 线程安全,可重入,信号安全
- 可重入/线程安全/信号安全/异常安全
- 信号可重入线程安全
- 异步信号安全和线程安全
- 可重入、异步信号安全和线程安全
- 异步信号安全和线程安全
- 可重入、线程安全、异步信号安全
- 异步信号安全和线程安全
- 异步信号安全和线程安全
- 可重入、异步信号安全和线程安全 .
- 异步信号安全和线程安全
- 可重入、异步信号安全和线程安全
- 异步信号安全(可重入性)与线程安全
- 关于异步信号安全、线程安全、可重入
- const在函数前与函数后的区别
- 快速上下移动到网页的顶部和底部
- 松本行弘:我的编程人生
- java permgen space outOFMemory 总结
- android 学习知识点累计
- 信号安全跟线程安全函数背后本质
- java环境变量引起的编译错误(包括package等的说明)
- Python的dict类型迭代性能的优化(items()与iteritems()、keys()与iterkeys()、values()与itervalues()的区别)
- JNI 安装 Cygwin, nDK
- java读取文件propeties...
- 在苹果lion中安装xcode3系列版本
- Windows Vista/7中关机、睡眠和休眠的区别
- 为什么页面接收到的中文是乱码?
- MacOS下卸载XCode的命令