可重入函数与线程安全

线程安全:

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

导致线程安全问题需要满足下面两个条件:

1>:一定是发生在多个线程访问一个全局变量或者静态变量的场景下面。
2>:操作时非原子性的。

如何避免线程安全:

对访问全局或静态变量的语句前后加锁,这样就不会导致多个线程访问同一个资源的问题发生。

可重入函数:

可重入函数的概念很简单,就是这个函数是可以在任何时候都可以被打断,并且不会造成线程安全,由于在可重入函数中使用的都是线程自己的栈空间,变量是唯一的,不会造成访问同一个资源的问题,如果要在其种访问全局或静态变量还是要加上锁来避免冲突。

系统中有很些函数是不能用在可重入函数中的:例如malloc,new,还有一些I/O接口函数等。

时间: 2024-11-05 14:39:04

可重入函数与线程安全的相关文章

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

1.可重入函数 可重入函数即表示可以被多个执行流重复进入,意味着只使用自己栈上的变量,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰. 一个不可重入函数的例子: int global; int fun( int a ) { int temp; global = a; temp = gloabl*2; return temp; } global是一个全局变量,若进程a运行这段代码传入的参数是2,预期的结果是4:进程b也运行这段代码,传入的参数是3,由于操作系统的进程调

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

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

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

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

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

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

可重入函数和线程安全

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

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

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

可重入函数、线程安全、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

线程安全与可重入函数

一.线程安全    在目前线程是操作系统调度的最小单元,进程是资源分配的最小单元.在大多数操作系统中,一个进程可以同时派生出多个线程.这些线程独立执行,共享进程的资源.线程主要由控制流程和资源使用两部分构成,因此一个不得不面对的问题就是对共享资源的访问.为了确保资源得到正确的使用,我们在设计编写程序时需要考虑避免竞争条件和死锁,需要更多地考虑使用线程互斥变量. 如果我们的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的

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

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