`

可重入函数及锁机制

阅读更多
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
目录

简介

可重入函数也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。
编辑本段
注意事项

编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。
若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。

附:java 高并发 ReentrantLock -- 可重入的锁
参见:http://blog.sina.com.cn/s/blog_67c1057e0100uwcn.html
http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html
什么时候选择用 ReentrantLock 代替 synchronized
既然如此,我们什么时候才应该使用 ReentrantLock 呢?答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 ReentrantLock 还具有可伸缩性的好处,应当在高度争用的情况下使用它,但是请记住,大多数 synchronized 块几乎从来没有出现过争用,所以可以把高度争用放在一边。我建议用 synchronized 开发,直到确实证明 synchronized 不合适,而不要仅仅是假设如果使用 ReentrantLock “性能会更好”。请记住,这些是供高级用户使用的高级工具。(而且,真正的高级用户喜欢选择能够找到的最简单工具,直到他们认为简单的工具不适用为止。)。一如既往,首先要把事情做好,然后再考虑是不是有必要做得更快。
分享到:
评论

相关推荐

    可重入函数与不可重入函数

    在多任务和实时系统编程中,函数的可重入性是一个重要的概念。函数的可重入性关系到程序能否在多线程或者中断服务中安全地执行,以及能否在多任务环境下被多个任务安全地调用。下面将详细介绍可重入函数与不可重入...

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

    通过避免使用全局或静态变量、利用线程私有数据以及适当使用同步机制等方式,可以有效地实现函数的可重入性和线程安全性。此外,选择适当的线程安全库函数也是提高程序质量的有效途径之一。理解并应用这些原则,可以...

    Linux 中可重入函数与不可重入函数详解

    在Linux操作系统中,可重入函数(Reentrant Function)和不可重入函数(Non-reentrant Function)是编程中两个非常重要的概念,特别是在多线程和并发编程中。它们的特性决定了它们在处理并发请求时的行为差异,对于...

    总结:重入函数和不可重入函数

    重入函数和不可重入函数是编程...程序员应该尽量编写可重入函数,并在必要时使用适当的同步机制来改造不可重入函数,以适应多任务环境。在编写代码时,始终考虑并发执行的可能性,这将有助于创建更健壮、更安全的系统。

    多任务系统中的不可重函数使用注意事项

    ### 多任务系统中的不可重入函数使用注意事项 #### 前言 本文将深入探讨在多任务系统中,特别是针对STM32平台,如何合理使用不可重入函数以避免出现错误。首先,我们将明确可重入函数与不可重入函数的区别,并给出...

    可重入详解可重入详解

    可重入函数应当避免使用这样的锁机制。 5. **不调用不可重入的函数**:如果一个函数调用了另一个不可重入的函数,那么它自身也不再是可重入的。 #### 三、示例分析 以下是一段示例代码,用于说明非可重入与可重...

    再入函数C51单片机程序

    此时,应当采取措施确保全局变量的访问是线程安全的,比如使用互斥锁机制。 - **函数参数的处理**:为了减少函数间的副作用,再入函数通常通过传递指针或引用的方式间接访问数据,而不是直接修改函数外部的数据结构...

    Java可重入锁的实现原理与应用场景

    Java可重入锁是一种特殊的锁机制,允许同一个线程在不同的层次上获取同一个锁,而不会发生死锁或阻塞的情况。这种锁机制广泛应用于多线程编程中,用于解决线程之间的同步问题。 Java可重入锁的实现原理主要基于锁的...

    java进阶提高学习教程-14锁机制.pptx

    可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。可重入锁能够避免死锁。Java 中的 ReentrantLock 和 synchronized 都是可重入锁。 读写锁 读写锁可以...

    linux锁机制分析

    ### Linux锁机制分析 #### 一、加锁的原因与竞态条件 在多线程或并发环境下,多个任务对共享资源或数据进行访问时,如果不加以控制,可能会导致数据的一致性问题,甚至数据错乱。例如,在一个简单的计数器增加操作...

    多任务系统中的不可重函数使用注意事项.pdf

    在多任务系统中,不可重(Reentrant)函数的使用是一项关键且复杂的技术。不可重函数是指在并发环境中,如果一个函数在执行过程中修改了共享数据或者资源,并且没有进行适当的同步控制,那么当多个任务同时调用这个...

    PHP阻塞锁和非阻塞锁机制

    这些服务提供了原子操作,如`setnx()`(Set if Not eXists)命令,可以用于实现锁机制。在尝试获取锁时,如果锁已被其他进程持有,命令会立即返回失败,而不是让当前请求进入等待状态。 **Yurunsoft的YurunLock**是...

    金吉士门锁接口函数

    2. **安全机制**:门锁接口函数应具备严格的安全措施,以确保只有授权的系统能执行操作。这可能涉及到加密通信、身份验证和授权机制,如使用API密钥或证书进行身份验证。 3. **错误处理**:函数通常会返回错误代码...

    Java源码解析之可重入锁ReentrantLock

    Java源码解析之可重入锁ReentrantLock ReentrantLock是一个可重入锁,在ConcurrentHashMap中使用了ReentrantLock。它是一个可重入的排他锁,它和synchronized的方法和代码有着相同的行为和语义,但有更多的功能。 ...

    proUSB门锁接口函数[0921最新]

    由于USB通信可能受到各种因素的影响,如硬件故障、数据包丢失或冲突,因此接口函数需要包含适当的错误处理机制。此外,实时性要求高的门锁操作可能依赖于中断传输,中断处理函数需要及时响应USB端点的事件。 7. **...

    关于线程安全与可重入性.pdf

    具备可重入性的函数在内部使用了线程安全的数据结构和机制,例如互斥锁,使得它们可以在多线程环境中安全地被调用。在使用可重入函数时,开发者可以不必担心函数内部是否正确处理了线程同步问题。 总结来说,理解并...

    线程间同步机制 读写锁通信机制 线程与信号

    读写锁分为读锁和写锁,读锁可被多个线程同时持有,但写锁是独占的。当一个线程持有了写锁,其他线程都不能获取读锁或写锁;而当一个线程持有了读锁,其他线程可以继续获取读锁,但不能获取写锁。这样设计可以提高多...

    java代码-证明synchronized可重入锁

    例如,一个线程在执行递归函数时,每次进入函数都需要获得锁,如果锁不可重入,那么递归调用将无法进行,程序将陷入死锁。 在`README.txt`文件中,可能会包含对这段代码的解释和运行结果的描述。它可能会指出,当...

Global site tag (gtag.js) - Google Analytics