可重入函数与线程安全的区别和联系

1、可重入函数

可重入函数即表示可以被多个执行流重复进入,意味着只使用自己栈上的变量,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。

一个不可重入函数的例子:

int global;

int fun( int a )

{

int temp;

global = a;

temp = gloabl*2;

return temp;

}

global是一个全局变量,若进程a运行这段代码传入的参数是2,预期的结果是4;进程b也运行这段代码,传入的参数是3,由于操作系统的进程调度,进程a中的global就有可能被覆盖,结果不一定是预期结果。

要想保证函数是可重入函数,在函数体内不能访问全局变量,不使用静态局部变量,(静态变量和全局变量都存在静态区)坚持只使用局部变量,写出的函数就将是可重入的。如果必须访问全局变量,可以利用互斥信号量来保护全局变量。

2、线程安全

线程: 是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。一个进程中可以并行多个线程,每条线程并行执行不同的任务。

线程安全: 如果一段代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。线程安全问题是由全局变量及静态变量引起的。

3、重入函数与线程安全的区别和联系

联系:引发线程安全和可重入函数问题的原因是一样的,都是由于使用了全局变量及静态变量。

区别:可重入函数问题,是对于不同进程间来说的,而线程安全问题是针对同一个进程中的不同线程来说的。

时间: 2024-12-28 14:03:18

可重入函数与线程安全的区别和联系的相关文章

可重入函数 与线程安全的区别与联系

线程安全:多个线程访问同一个区域的时候其最终结果是可预期的,并不会因为产生冲突或者异常中断再次恢复而使结果不可预期 1.重入:函数被不同的控制流程调用,有可能在第一次调用还没有返回的时候就再次进入该函数这称之为 重入: 2.不可重入函数:当访问一个全局的变量或者参数的时候,有可能因为重入造成错乱,像这样的函数称之为不可重入函数 如果一个函数符合以下条件之一则是不可重入的 (1)调用了malloc/free,因为malloc是用全局链表来管理堆的 (2)调用了标准I/O卡函数,biaozhun I

Linux可重入函数和线程安全的区别与联系(转)

*****可重入函数 函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入. 当程序运行到某一个函数的时候,可能因为硬件中断或者异常而使得在用户正在执行的代码暂时终端转而进入你内核,这个时候如有一个信号需要被处理,而处理的这个信号的时候又会重新调用刚才中断的函数,如果函数内部有一个全局变量需要被操作,那么,当信号处理完成之后重新返回用户态恢复中断函数的上下文再次继续执行的时候,对同一个全局变量的操作结果可能就会发生改变而并不如我们预期的那样,这样的函数被称为不可重入

可重入函数与线程安全的区别与联系

1.可重入函数 1)举例说明: main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的时候,因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换到sighandler函数sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的两步都做完之后从sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续往下执行,先前做第一步之后被打断,现在继续做完第二步.结果

可重入函数与线程安全问题

线程安全函数 确保线程安全:        要确保函数线程安全,主要需要考虑的是线程之间的共享变量.属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器.因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量.局部静态变量.分配于堆的变量都是共享的.在对这些共享变量进行访问时,如果要保证线程安全,则必须通过加锁的方式. 线程不安全的后果:        线程不安全可能导致的后果是显而易见的--共享变量的值由于不同线程的访问,可能发生不可

可重入函数和线程安全

一.可重入函数 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;,局部变量可重入函数: 不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的. 如上图: main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的 时候,因为硬

可重入函数与线程安全

线程安全: 假如在一个函数中它是这么写的,在一个全局链表上存放数据,在单线程模式下,我们先new一个新的节点然后让head->next指向这个节点,这种场景在多线程场景下会是这样的过程,线程一new了一个节点,然后cpu转去执行线程二,线程二new一个节点后head->next指向线程二,然后执行线程一,线程一的head->next也指向它刚刚new出来的节点,这就导致一个head指向了两个节点,这也就是线程安全的问题. 导致线程安全问题需要满足下面两个条件: 1>:一定是发生在多

可重入函数、线程安全、volatile

一. POSIX 中对可重入和线程安全这两个概念的定义: Reentrant Function:A function whose effect, when called by two or more threads,is guaranteed to be as if the threads each executed the function one after another in an undefined order, even if the actual execution is inte

线程安全和可重入函数之间的区别和联系

概念 重入:即重复调用,函数被不同的流调用,有可能会出现第一次调用还没返回时就再次进入该函数开始下一次调用. 可重入:当程序被多个线程反复执行,产生的结果正确. 如果一个函数只访问自己的局部变量或参数,称为可重入函数. 不可重入:当程序被多个线程反复调用,产生的结果出错. 当函数访问一个全局的变量或者参数时,有可能因为重入而造成混乱,像这样的函数称为不可重入函数. 线性安全:一般来说,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果. 可重入函数与线程安全的区别

线程安全与可重入函数的区别及联系

一.线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的.  或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题. 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执