什么是可重入函数
函数 什么 重入
2023-09-14 09:02:05 时间
什么叫可重入:
如何编写可重入的函数?
不要使用全局变量。因为别的代码很可能覆盖这些变量值。 在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”。 不能调用其它任何不可重入的函数。 谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL。(没用过,不懂)
Linux系统编程-(pthread)线程通信(自旋锁) 自旋锁不管是内核编程,还是应用层编程都会用到;自旋锁和互斥量类似,它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(也就叫自旋)状态。
Linux系统编程-(pthread)线程通信(信号量) 信号量的运用环境与互斥锁一样,但是信号量比互斥锁增加灵活,互斥锁只有两个状态(开锁和解锁),而信号量本质上是一个计数器,它内部有一个变量计数信号值,可以保护一个资源可以同时被1个或者2个或者3个线程同时使用,如果信号量的值只是设置1(状态只有0和1),那么和互斥锁就是一样的功能。
Linux系统编程-(pthread)线程通信(互斥锁) 这篇文章介绍Linux下线程同步与互斥机制--互斥锁,在多线程并发的时候,都会出现多个消费者取数据的情况,这种时候数据都需要进行保护,比如: 火车票售票系统、汽车票售票系统一样,总票数是固定的,但是购票的终端非常多。
Linux系统编程-(pthread)线程通信(条件变量) 条件变量是线程可用的一种同步机制,条件变量给多个线程提供了一个回合的场所,条件变量和互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。 条件变量本身是由互斥体保护的,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获取互斥量之前就不会觉察到这种变化,因为互斥量必须锁定之后才改变条件。
可重入是一个并发下才有的概念。如果说,程序是串行的,自然也就不会有可重入这回事了。因为并发,所以任何个步骤都可能在运行中途被中断,然后跑另一个代码。这样就会出现一种可能,比如说两段代码都操作了一个全局变量,就会造成意想不到的错误。
可重入函数指的是,有多个线程在并发的执行一个函数。这个时候,如果两个函数会操作同一个全局的变量。这就是上面说的场景了。
什么样的函数不可重入: 函数体内使用了静态的数据结构(全局变量等)。 函数体内调用了malloc()或者free()函数。 函数体内调用了标准I/O函数。注意:malloc函数是不能并发使用的。
举个例子:在网络开发中 经常出现需要从主机名得到ip地址的情况 这时就使用gethostbyname。很不巧的是,gethostbyname返回的是一个指向静态变量的指针,不可重入。 很可能刚要读时值就被其它线程修改。所以 新的posix中增加了另一个可重入域名解析的函数gethostbyname_r。
gethostbyname_r允许传入地址A和一个缓冲区的地址B,它会把主机信息写入到缓冲区中,然后在地址A上写入结构体,结构体中的指针指向缓冲区。这样实现了可重入,只要传入的缓冲区是独立的。
于是,这就成功引起了GHOST漏洞。关于这个漏洞,可参考《GHOST漏洞原理简单分析》。
另一个来自网上的例子:A. 可重入函数
如何编写可重入的函数?
在函数体内不访问那些全局变量,不使用静态局部变量,坚持只使用局部变量,写出的函数就将是可重入的。如果必须访问全局变量,记住利用互斥信号量来保护全局变量。
不要使用全局变量。因为别的代码很可能覆盖这些变量值。 在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”。 不能调用其它任何不可重入的函数。 谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL。(没用过,不懂)
其实,可重入函数和通常的并发编程遇到的问题是一样的,只是不那么容易发现。
我觉得并发编程最难的就是线程同步,就是要解决并发时引起的变量不确定性,还要尽可能高效。这就得靠程序员如何设计一个巧妙地数据结构了。
转载请注明:旅途@KryptosX » 什么是可重入函数
Linux系统编程-(pthread)线程通信(自旋锁) 自旋锁不管是内核编程,还是应用层编程都会用到;自旋锁和互斥量类似,它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(也就叫自旋)状态。
Linux系统编程-(pthread)线程通信(信号量) 信号量的运用环境与互斥锁一样,但是信号量比互斥锁增加灵活,互斥锁只有两个状态(开锁和解锁),而信号量本质上是一个计数器,它内部有一个变量计数信号值,可以保护一个资源可以同时被1个或者2个或者3个线程同时使用,如果信号量的值只是设置1(状态只有0和1),那么和互斥锁就是一样的功能。
Linux系统编程-(pthread)线程通信(互斥锁) 这篇文章介绍Linux下线程同步与互斥机制--互斥锁,在多线程并发的时候,都会出现多个消费者取数据的情况,这种时候数据都需要进行保护,比如: 火车票售票系统、汽车票售票系统一样,总票数是固定的,但是购票的终端非常多。
Linux系统编程-(pthread)线程通信(条件变量) 条件变量是线程可用的一种同步机制,条件变量给多个线程提供了一个回合的场所,条件变量和互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。 条件变量本身是由互斥体保护的,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获取互斥量之前就不会觉察到这种变化,因为互斥量必须锁定之后才改变条件。
相关文章
- 【说站】python有哪些数组叠加函数
- 【说站】python中sigmoid函数是什么
- 【说站】c语言中exit函数是什么
- 【说站】c语言中realloc函数是什么
- 【说站】css中couters函数是什么
- php中str什么意思_php中isset函数作用
- 常量表达式函数[通俗易懂]
- MySQL中简单易用的字符串函数(mysql取字符串函数)
- Oracle函数:一种强大的数据库处理工具(什么是oracle函数)
- Oracle中不能使用零参数函数(oracle不等于零函数)
- 解析phpsession_set_save_handler函数的用法(mysql)
- js中split函数的使用方法说明
- php中strtotime函数用法详解
- PHP中可以自动分割查询字符的Parse_str函数使用示例
- 告诉你什么是javascript的回调函数