2016 - 2024

感恩一路有你

可重入是什么意思 可重入锁的原理?

浏览量:2541 时间:2021-03-13 05:25:32 作者:admin

可重入锁的原理?

重入锁实现的原理或机制如下:

每个锁都与一个线程保持器和一个计数器相关联。当计数器为0时,表示锁没有被任何线程持有,那么任何线程都可以获得锁并调用相应的方法。当线程请求成功时,JVM将记录持有锁的线程,并将计数器设置为0 1。此时,如果其他线程请求锁,则必须等待;如果持有锁的线程再次请求锁,则可以再次获得锁,计数器将增加;当线程退出同步代码块时,计数器将减少;如果计数器为0,则释放锁。

什么是可重入?

可重入函数可由多个任务同时使用,无需担心数据错误。相反,非可重入函数不能由多个任务共享,除非它们相互排斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以随时中断,以后继续运行而不会丢失数据。可重入函数要么使用局部变量,要么在使用全局变量时保护其数据。可重入函数:不为连续调用保存静态数据。不返回指向静态数据的指针;所有数据都由函数的调用者提供。通过使用本地数据或制作全局数据的本地副本来保护全局数据。如果必须访问全局变量,请记住使用互斥信号量来保护它们。永远不要调用任何不可重入的函数。

什么是可重入函数?

可重入函数:主要用于多任务环境。可重入函数只是一个可以中断的函数。换言之,当函数被执行时,它可以在任何时候被中断,然后转移到操作系统调度以执行另一段代码。返回控件时不会出错。

单片机C语言设计里说的可重入函数是什么?和不可重入函数的区别是什么?

1、可重入函数

1)什么是可重入函数?

可重入函数可由多个任务同时使用,无需担心数据错误。相反,非可重入函数不能由多个任务共享,除非它们相互排斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以随时中断,以后继续运行而不会丢失数据。可重入函数要么使用局部变量,要么在使用全局变量时保护其数据。

2)可重入函数:

不保留连续调用的静态数据。

不返回指向静态数据的指针;所有数据由函数的调用者提供。

通过使用本地数据或制作全局数据的本地副本来保护全局数据。

如果必须访问全局变量,请记住使用互斥信号量保护它们。

切勿调用任何不可重入函数。

3)不可重入函数:

函数中使用静态变量,无论是全局变量还是局部变量。

函数返回一个静态变量。在函数中调用不可重入的函数。

在函数体中使用静态数据结构;

在函数体中调用malloc()或free()函数;

在函数体中调用其他标准I/O函数。

函数是单例中的成员函数,它使用的成员变量不是由线程独立存储的。

一般来说,如果函数在重入条件下使用未受保护的共享资源,则该函数不可重入

请举例说明。编写以下VI按照默认设置执行程序,整体输出X-Y为2000ms,这是因为为了避免地址中数据的混淆,LabVIEW会先执行一个VI再执行另一个VI,执行顺序是随机的。如果将delay VI的属性设置为“共享拷贝重入执行”或“预分割拷贝重入执行”,然后执行该程序,则发现该程序已改为原来的1000ms,这是因为:LabVIEW在异地调用可重入VI时,会给它分配一个单独的数据地址空间。这是线程安全的。在两个线程中执行的sub VI使用存储在不同地址的两个数据副本,这不会引起混淆。VI的重入不会使程序无序运行,但也会增加内存消耗。相当于多个VI重入调用占用不同的空间。

关于Labview 2012中VI的可重入性修改?

可重入锁:支持重复输入的锁。这意味着锁可以支持线程对资源的重复锁定。

关键字“sychronized”隐式支持重入,例如使用sychronized修改的递归方法。在方法执行期间,执行线程在获取锁之后可以多次获取锁。

尽管reentrantlock不能像sychnronized关键字那样隐式地重新输入,但是在调用lock()方法时,获得锁的线程可以再次调用lock()方法来获得锁,而不会被阻止。

如何理解Java锁的可重入性?

使用Keil C51编译器在51核MCU上编写C程序时,这个问题可能更严重。因为keil通过覆盖技术优化变量,相同的内存地址可能会被重复分配给不同的函数。例如,在主函数中调用的延迟函数的变量可以被中断函数调用的相同延迟函数的变量所覆盖。因此,在keilc51中编写可能同时被多个函数调用的子函数时,最好将其声明为可重入函数。

单片机用的软件的可重入函数与非可重入函数有啥区别?

字面意思是您可以重复输入。可重入性是多任务系统中的一个概念,它意味着该函数在运行到任何位置时都可以被中断以执行其他任务,并且返回时不会出错。当我们同时处理多个任务时,为什么会有这个概念呢。我举个例子。我们定义了一个名为func的函数和两个线程。两个线程都调用func。情况就是这样。当线程1执行func时,线程2开始执行func。结果,两个线程都执行了两次func。在正常情况下,两个线程都可以成功执行,并且没有错误。我们认为func是一个可重入函数。但是,如果func使用一个公共资源,例如读取同一个文件或访问同一个全局变量,则当两个线程访问公共资源时,会导致冲突。这样的函数是不可重入的。

什么是C语言的可重入函数?怎么使用?

假设exam是int型全局变量,函数squareuexam返回exam的平方。那么下面的函数是不可重入的。

unsigned int example(int para)

{

unsigned int temp

Exam=para//(**)

temp=Square如果此函数由多个进程调用,则结果可能未知,因为使用此函数的另一个进程可能会在执行(**)语句后被激活,因此,当新激活的进程执行此函数时,它将为exam分配一个不同的para值,因此当控件在“exam()”之后返回到“temp=square”时,计算出的temp可能不是预期的结果。该功能应改进如下。

Unsigned int example(int para)

{

Unsigned int temp

[请求信号量操作]//(1)

exam=para

temp=squareuuexam()

[释放信号量操作

]返回temp

}](1)如果“信号量”无法应用,它表示另一个进程正在为检查赋值并计算其平方(即,它正在使用此信号)。此进程必须等待其释放信号,然后才能继续执行。如果应用了该信号,它可以继续执行,但是其他进程必须等待该进程释放信号量,然后才能再次使用该信号。

确保可重入函数的方法:在编写函数时,尽量使用局部变量(如寄存器和堆栈中的变量),并保护要使用的全局变量(如关闭中断、信号量等),以便函数必须是可重入函数。

VxWorks中使用的可重入技术如下:

*动态堆栈变量(每个子函数都有自己独立的堆栈空间)

*受保护的全局变量和静态变量

*任务变量

可重入是什么意思 可重入锁好处 可重入代码是什么

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。