可重入:

lfl@ubuntu:/usr/include$ vi errno.h

重点看该文件中下面的内容

/* Declare the `errno' variable, unless it's defined as a macro by

bits/errno.h.  This is the case in GNU, where it is a per-thread

variable.  This redeclaration using the macro still works, but it

will be a function declaration without a prototype and may trigger

a -Wstrict-prototypes warning.  */

#ifndef errno

extern int errno;

#endif

红色字体部分即说明errno是一个宏。

lfl@ubuntu:/usr/include/i386-linux-gnu/bits$ vi errno.h

重点看该文件的中下面的内容:

# ifndef __ASSEMBLER__

/* Function to get address of global `errno' variable.  */

extern int *__errno_location (void) __THROW __attribute__ ((__const__));

#  if !defined _LIBC || defined _LIBC_REENTRANT

/* When using threads, errno is a per-thread value.  */

#   define errno (*__errno_location ())  //errno 是个宏,代表的是个函数。

#  endif

# endif /* !__ASSEMBLER__ */

#endif /* _ERRNO_H */

文件reentrant.c 的内容如下:

#include <errno.h>

int main()

{

errno;

return 0;

}

预处理的过程可以将宏进行替换,下面就进行预处理

lfl@ubuntu:~/test$ gcc -E reentrant.c -o reentrant.i

文件reentrant.i的内容如下:

# 2 "reentrant.c" 2

int main()

{

(*__errno_location ()); //宏errno被替换成这个函数了。

return 0;

}

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

例子:

int global_val 2;//定义个全局变量

void func()

{

global_val++;

}

如果有N个进程调用该函数,而global_val是个全局变量,如果某个进程加上-D _REENTRANT,则可重入,即该进程的global_val不会受其他进程的影响;但是没加-D _REENTRANT的那N-1个进程调用该函数时变量global_val就会彼此影响,出现不可预料的结果。不会影响的原因是,加-D _REENTRANT的进程虽然调用的还是这个函数,但是不同的时该机制自动把该函数变成了

void func_r()

{

global_val++;

}

跟其他进程调用的函数不同了,那么自然就不会影响本进程了,即可以重去。

-D_REENTRANT机制相关推荐

  1. 2021-02-02 _REENTRANT

    #ifndef _REENTRANT #error "请开启gcc编译器的多线程可重入选项-pthread" #endif 用gcc编译使用了POSIX thread的程序时通常需 ...

  2. Go语言的错误异常处理机制及其应用

    一.背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err = func(xx) if err != nil {//do sth. to tac ...

  3. 2022-2028年中国机制砂石行业投资分析及前景预测报告

    [报告类型]产业研究 [报告价格]¥4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国机制砂石行业市场行业相关概述.中国机制 ...

  4. c#打开数据库连接池的工作机制_数据库连接池-tomcat-jdbc使用笔记

    现在 主流的数据库连接池有:Proxool.C3P0.DBCP.tomcat-jdbc.Druid.其中tomcat-jdbc是tomcat服务器比较可靠的 数据库连接池. Tomcat 在 7.0 ...

  5. python异常机制

    python异常处理机制 1.1python的内置异常 当我们在运行代码的时候一旦程序报错,就会终止运行,并且有的异常是不可避免的,但是我们可以对异常进行捕获,防止程序终止. python的内置异常是 ...

  6. 【Sql Server】数据库的安全机制

     如何实现安全机制:从以下几个方面,但主要的途径是角色和授权的方面.掌握这些便可以很好的对数据进行保护! 安全机制 客户机 网传(加密) 实例(数据库服务器限制)-服务器角色 Windows OS 验 ...

  7. 各种注意力机制PyTorch实现

    给出了整个系列的PyTorch的代码实现,以及使用方法. 各种注意力机制 Pytorch implementation of "Beyond Self-attention: External ...

  8. pytorch中调整学习率的lr_scheduler机制

    pytorch中调整学习率的lr_scheduler机制 </h1><div class="clear"></div><div class ...

  9. Pytorch 多 GPU 并行处理机制

    Pytorch 的多 GPU 处理接口是 torch.nn.DataParallel(module, device_ids),其中 module 参数是所要执行的模型,而 device_ids 则是指 ...

最新文章

  1. python主程序流程图_python中的图形渲染(流程图可视化)
  2. 神策数据、阿里、华为、字节等携手推动个人信息保护工作
  3. 给Win7光盘添加PE3.0
  4. js 下拉层级多选_js控制的多级下拉菜单
  5. Java 1.1.6 码点与码点单元(回)
  6. NLP --- 命名体识别(NER)
  7. 如何搭建MySQL数据库,常用的数据库命令
  8. golang mac 环境变量_mac下配置go基本环境变量参数
  9. 190102每日一句
  10. AlphaGo增强式学习算法:实现‘高手指点’特效
  11. json转为tfrecord格式文件怎么转_JPG图片怎么转换成PDF?图片转PDF的免费软件有这些...
  12. tenda无线网卡Linux驱动,Ubuntu 10.04上腾达W541U V2.0 无线网卡驱动的使用
  13. 入驻shopee平台后,选择哪一个站点作为首站?
  14. Linux拨号上网后自动断开,Ubuntu 12.10 拨号上网及停用方法
  15. javaweb指导书
  16. 2 画图软件 界面设计
  17. JavaScript之DOM(中)
  18. 数据可视化:处理json文件
  19. 联想云计算机房建设方案,联想ThinkCloud Livc桌面虚拟化解决方案
  20. 平均回复在5s内的快捷短语

热门文章

  1. 优秀的人都在这样表现自己
  2. QT学习之QProcess进程调用
  3. win7计算机配置查询,win7电脑配置怎么看_win7电脑配置怎么查-win7之家
  4. 因为爬虫失控,CTO 和程序员双双被判刑
  5. 自律到极致-人生才精致:第7期
  6. SSRF漏洞原理攻击与防御(超详细总结)
  7. 湖南大学21夏训练三10. Maya历法
  8. docker-compose常用命令和yml配置文件
  9. 音视频框架-webrtc中的网络反馈与控制
  10. linux syslog