没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
UNIX 编程中错误输出的线程安全问题
2008 年 6 月 26 日
在多线程的 UNIX 应用程序中,系统调用出错时,错误输出有时可能不会像在单线程系统
中那样正确的反应错误所在,因为需要考虑多线程情况下所使用的错误输出方式是否安全等
问题。希望本文能对大家在多线程场景下选择错误报告的输出方式有所启发。
系统调用失败原因分析
在 UNIX 编程中,我们会经常使用系统调用来完成期望的功能;而与此同时,我们也需要
付出大段的代码来检测、输出错误和其他意外情况。
以下是系统调用失败的可能原因:
系统可能出现资源短缺或者程序使用的资源可能超过系统为单个程序规定的上限。常见的情
况有:程序可能尝试分配大量内存,或者同时打开很多文件等。
程序执行操作时,可能会由于权限不足而被系统阻止。例如,程序可能会试图写一个只读的
文件,或者企图访问其他进程的内存空间。
传入系统调用的参数可能无效,原因可能是用户提供无效输入或者程序本身的 bug。例如,
程序可能会传入一个无效的内存地址或者无效的文件描述符。
系统调用还有可能因为程序之外的原因出错。系统调用访问硬件的时候经常会有这种情况发
生。设备可能会出现异常错误或者不支持特定的操作,或者可能会出现磁盘没有插入驱动器
中的情况出现。
系统调用有的时候会被外部事件 ( 如信号等 ) 中断。这可能不代表真正的调用失败,但是
如果有必要,程序应当重新尝试执行系统调用。
回页首
库函数的线程安全
Glibc 为上述系统调用失败场景提供了丰富的库函数来处理错误输出。但是任何事物都存在
双刃剑,这些错误输出库函数在为我们带来便利的同时,也给我们带来了一定的安全隐患
——线程安全问题。
线程安全是为了避免数据竞争或者数据设置的正确性依赖于多个线程修改数据的顺序。假设
你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果
每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就
是线程安全的。
对于函数来说,在多线程或有异常控制流的情况下 , 当某个函数运行到中途时 , 控制流
( 也就是当前指令序列 ) 就有可能被打断而去执行另一个函数。而这个函数很有可能是它
本身。如果在这种情况下不会出现问题 , 比如说数据或状态不会被破坏,行为确定。那么
资源评论
G11176593
- 粉丝: 6664
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功