电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

Linux多线程编程问题VIP免费

Linux多线程编程问题_第1页
1/7
Linux多线程编程问题_第2页
2/7
Linux多线程编程问题_第3页
3/7
Linux 多线程编程问题 1 重入问题 传统的UNIX 没有太多考虑线程问题,库函数里过多使用了全局和静态数据,导致严重的线程重入问题。 1.1 –D_REENTRANT /-pthread 和errno 的重入问题。 所先 UNIX 的系统调用被设计为出错返回-1,把错误码放在 errno 中(更简单而直 接的方法应该是程序直接返回错误码,或者通过几个参数指针来返回)。由于线程 共享所有的数据区,而 errno 是一个全局的变量,这里产生了最糟糕的线程重入问 题。比如: do { bytes = recv(netfd, recvbuf, buflen, 0); } while (bytes != -1 && errno != EINTR); 在上面的处理 recv 被信号打断的程序里。如果这时连接被关闭,此时 errno 应该不 等于 EINTR,如果别的线程正好设置 errno 为 EINTR,这时程序就可能进入死循环。 其它的错误码处理也可能进入不可预测的分支。 在线程需求刚开始时,很多方面技术和标准(TLS)还不够成熟,所以在 为 了 解决这个重入问题引入了一个解决方案,把 errno 定义为一个宏: extern int *__errno_location (void); #define errno (*__errno_location()) 在上面的方案里,访问errno 之前先调用__errno_location()函数,线程库提供这个 函数,不同线程返回各自errno 的地址,从而解决这个重入问题。在编译时加 -D_REENTRANT 就是启用上面的宏,避免 errno 重入。另外 -D_REENTRANT 还影响一些 stdio 的函数。在较高版本的gcc 里,有很多嵌入函数的优化,比如把 printf(“Hello\n”); 优化为 puts(“hello\n”); 之类的,有些优化在多线程下有问题。所以 gcc 引入了 –pthread 参数,这个 参数出了-D_REENTRANT 外,还校正一些针对多线程的优化。 因为宏是编译时确定的,所以没有加-D_REENTRANT 编译的程序和库都有errno 重入问题,原则上都不能在线程环境下使用。不过在一般实现上主线程是直接使用 全局errno 变量的,也就是 __errno_location()返回值为全局&errno,所以那些没加 -D_REENTRANT 编译的库可以在主线程里使用。这里仅限于主线程,有其它且只 有一个固定子线程使用也不行,因为子线程使用的errno 地址不是全局errno 变量 地址。 对于一个纯算法的库,不涉及到 errno 和stdio 等等,有时不加_REENTRANT 也是 安全的,比如一个纯粹的加密/解谜函数库。比较简单的判断一个库是否有errno 问 题是看看这个库是使用了errno 还...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

Linux多线程编程问题

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部