首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux并发(函数的重入性)

重入函数是并发编程中必须要考虑的问题,否则代码就会有隐患,更糟糕的是这些隐患往往只能在特定场景下才能复现。...拓展: 一个函数所谓的重入性,是在多线程的语境下的概念:一个函数如果同时被多条线程调用,他返回的结果都是严格一致的,那么该函数被称为“重入”函数(reentrance funciton),否则被称为...“不可重入”函数。...二是因为函数内部调用了其他不可重入函数。 三是因为函数执行结果与某硬件设备相关。...从这点出发,如果你想要写一个线程安全的重入函数的话,只要遵循以下原则就行了: A) 不使用任何静态数据,只使用局部变量或者堆内存。 B) 不调用上表中的任何非线程安全的不可重入函数。

1.3K40
您找到你想要的搜索结果了吗?
是的
没有找到

重入分析

重入分析 1. 什么是“重入” 2. 可能出现重入问题的接口 2.1 单个网络调用 2.2 多段网络调用 2.3 有状态接口 3. 重入保证的关键场景 4....什么是“重入” 一般情况下,重入指的是接口(函数)可以重复调用且不发生异常。 个人认为,与幂等相比,重入是一个业务概念。...比如登录接口,第一次登录成功后进行重复登录,若返回“登录成功”此时是幂等的(也是重入的),若返回“您已登录”此时是重入的但非幂等。 个人觉得没必要纠结幂等与重入的概念细节差异。...注:重入问题和不可重入问题和重入问题,都是同一个问题,都是指:可能存在不可重入的情况,但是想要保证重入。 2....必定重入: 无数据变更(幂等接口)必定重入 必定不可重入: 存在多段网络调用进行数据变更的接口,前段逻辑的返回值受数据变化影响,且该数据会被当前接口修改(重入时可能出现后段逻辑不可达的情况)

74220

重入函数

Linux下常见重入函数: POSIX.1-20001标准规定,所有的标准库函数都必须是重入函数,除了以下这些: 文章目录 重入函数 不可重入函数的特点 如何写出重入函数 上面是两张重入函数的函数表...,那,什么是重入函数呢?...重入函数 重入函数主要用于多任务环境中,一个重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源...,标准I/O库的很多实现都是以不可重入的方式使用全局的数据结构 (3)重入体内使用了静态的数据结构 ---- 如何写出重入函数 1.不在函数内部使用静态或全局变量 2.不返回静态或全局变量,所有数据都有函数的调用者提供...重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。 编写重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。

34320

Java不可重入锁和重入锁理解

最近正在阅读Java ReentrantLock源码,始终对重入和不可重入概念理解不透彻,进行学习后记录在这里。...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。...我们尝试设计一个不可重入锁: ? 使用该锁: ? 当前线程执行print()方法首先获取lock,接下来执行doAdd()方法就无法执行doAdd()中的逻辑,必须先释放锁。...这个例子很好的说明了不可重入锁。 重入锁 接下来,我们设计一种重入锁 ? 所谓重入,意味着线程可以进入它已经拥有的锁的同步代码块儿。...重入锁的概念和设计思想大体如此,Java中的重入锁ReentrantLock设计思路也是这样

1.9K11

关于重入函数

,这里直接导致嵌入式 linux 系统应用进程中的所有线程停掉,进而导致看门狗进程得不到喂狗,设备重启。...那什么是不可重入函数呢? 为什么中断处理函数不能直接调用不可重入函数? 怎样写重入函数? 就以上三个问题展开小短文: 2 什么是不可重入函数?...重入函数主要用于多任务环境中,一个重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源...在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是重入的,否则就不可重入。...4 如何写出重入的函数? 在函数体内不访问那些全局变量; 如果必须访问全局变量,记住利用互斥信号量来保护全局变量。

68010

java重入锁与不可重入

所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是重入锁。...重入锁的意义在于防止死锁。 实现原理是通过为每个锁关联一个请求计数器和一个占有它的线程。...重入锁: 接下来,我们设计一种重入锁 public class Lock{ boolean isLocked = false; Thread lockedBy = null;...重入锁的概念和设计思想大体如此,Java中的重入锁ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是重入锁。...摘自:JAVA重入锁与不可重入锁 和 Java不可重入锁和重入锁理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https

92520

重入锁和不可重入锁的区别

不可重入锁示例(同一个线程不可以重入上锁后的代码段) 如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后...isLocked = false; // 将这个值设置为false目的是释放锁 notify(); // 接触阻塞 } } 重入锁示例...(同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞) java的重入锁有:ReentrantLock(显式的重入锁)、synchronized(隐式的重入锁) 重入锁诞生的目的就是防止上面不可重入锁的那种情况...,导致同一个线程不可重入上锁代码段。...设计重入锁的示例代码 public class MyReentrantLock { boolean isLocked = false; // 默认没有上锁 Thread

43510

C语言重入函数和不可重入函数

所谓重入是指一个可以被多个任务调用的过程,任务在 调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。...重入函数可以被一个以上的任务调用,而不必担心数据被破坏。重入函数任何时候都可以被中断,一段时间以后又可以运行,而相应的数据不会丢失。...重入函数或者只使用局部变量,即保存在CPU寄存器中或堆栈中;或者使用全局变量,则要对全局变量予以保护。 说法2: 一个重入的函数简单来说,就是:可以被中断的函数。...把一个不可重入函数变成重入的唯一方法是用重入规则来重写他。 其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是重入的。 第一,不要使用全局变量。...把一个不可重入函数变成重入的唯一方法是用重入规则来重写他。 其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是重入的。 第一,不要使用全局变量。

3.3K30

C语言(重入函数)

综上所述的函数行为总结一个概念就是:在多次调用中(不管是否同时)行为变现一致的函数,被称为重入函数,否则被称为不可重入函数。...POSIX.1-20001标准规定,所有的标准库函数都必须是重入函数,除了以下这些: ?...二是因为函数内部调用了其他不可重入函数。 三是因为函数执行结果与某硬件设备相关。...从这点出发,如果你想要写一个线程安全的重入函数的话,只要遵循以下原则就行了: A) 不使用任何静态(老不死)数据,只使用局部变量或者堆内存。 B) 不调用上表中的任何非线程安全的不可重入函数。...如果不能同时满足以上两个条件,可以使用信号量、互斥锁等机制来确保使用静态数据或者调用不可重入函数时的互斥效果。其实,这也是编写多线程程序必须要注意的地方啦!

2.3K40

Linux系统下读取目录操作及重入函数介绍

这样的函数是不安全的函数,也叫不可重入函数。相反,肯定有一个安全的函数,这个安全的函数又叫重入函数。那么什么是重入函数呢?...所谓重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。...重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。 编写重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。...那么如下函数不具有重入性。...保证函数的重入性的方法: 1)在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量); 2)对于要使用的全局变量要加以保护(如采取关中断、信号量等互斥方法),这样构成的函数就一定是一个重入的函数。

1.6K10

探索JAVA并发 - 重入锁和不可重入

什么是重入锁,什么是不可重入锁,它们是如何实现的?...定义 重入锁:当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁; 不可重入锁:与重入相反,获取锁后不能重复获取,否则会死锁(自己锁自己)。 不可重入锁 用代码说话。...重入锁 不可重入锁扩展一下,增加一个计数器,同一个线程每次获取锁计数器加1,释放锁减1,为0时释放锁。...} /* 输出: main 获得了锁 main 再次获得了锁, count = 2 main 释放了锁,count = 1 main 释放了锁,count = 0 main 彻底释放了锁 */ 重入锁...synchronized 没错,用于声明同步方法/代码块的synchronized关键字提供的也是一个重入锁。

2.7K41

c语言重入函数_c语言不可重入函数有哪些

什么是重入函数 重入函数指一个同时被多个任务调用的过程,当一个函数满足下列条件时多为不可重入函数 (1)函数中使用了静态的数据结构; (2)函数中使用了malloc()、free()函数; (3...(如open、read、write、close等系统调用) 如何编写重入函数 (1)编写重入函数时,不应使用static局部变量,应使用auto即缺省态局部变量或寄存器变量。...不可重入函数示例: //Num为int型全局变量,函数Inc_Num返回Num加1的值 unsigned int example(int value) { unsigned int tmp;...Num = value; tmp = Inc_Num(); return tmp; } 重入示例: //Num为int型全局变量,函数Inc_Num返回Num加1的值 unsigned

79440

Java中的重入

所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是重入锁。...重入锁的意义在于防止死锁。 重入锁简单演示 什么是 “重入”,重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。...,重入,就是可以重复获取相同的锁,synchronized和ReentrantLock都是重入的 //重入降低了编程复杂性 public class WhatReentrant { public...重入锁: 接下来,我们设计一种重入锁 public class Lock{ boolean isLocked = false; Thread lockedBy = null;...重入锁的概念和设计思想大体如此,Java中的重入锁ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是重入锁。

1.2K40
领券