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

线程安全与可重入函数的区别 线程安全简述线程安全是指在多线程环境下,同一函数或函数库被不同线程调用,不会出现数据不一致的情况。另一篇博客线程安全与线程不安全,有一个小例子对比了线程安全与线程不安全。确定一个函数不是线程安全的: 函数中访问全局变量或者静态变量。 函数中动态分配或释放堆资源。 函数中使用了其他线程不安全的函数。 值得注意的是线程安全一定是在多线程环境*=下,在单线程(即只有一个线程的进程)环境中并不存在这个说法。 阅读详情
可重入函数与线程安全函数
顶嵌(TOP-E)|嵌入式linux企业培训|嵌入式Linux就业实训|承接嵌入式项目开发   2009-01-23 12:02:59 作者:顶嵌开源 来源:原创 文字大小:[大][中][小]

可重入函数(reentrant function)与线程安全函数(thread-safe function)有时容易混淆,而且各种文档中的解释也不是很清楚,这里根据笔者的经验来说明一下。

 

Ø         线程安全函数

·            概念:

线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。

·            确保线程安全:

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

·            线程不安全的后果:

线程不安全可能导致的后果是显而易见的——共享变量的值由于不同线程的访问,可能发生不可预料的变化,进而导致程序的错误,甚至崩溃。

 

Ø         可重入函数

·            概念:

可重入的概念基本没有比较正式的完整解释,多数的文档都只是说明什么样的情况才能保证函数可重入,但没有完整定义。按照Wiki上的说法,“A computer program or routine is described as reentrant if it can be safely executed concurrently; that is, the routine can be re-entered while it is already running.”根据笔者的经验,所谓“重入”,常见的情况是,程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行的函数foo(),这样便发生了所谓的重入。此时如果foo()能够正确的运行,而且处理完成后,之前暂停的foo()也能够正确运行,则说明它是可重入的。

·            确保可重入:

要确保函数可重入,需满足一下几个条件:

1、不在函数内部使用静态或全局数据
2
、不返回静态或全局数据,所有数据都由函数的调用者提供。
3
、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
4
、不调用不可重入函数。

·            不可重入的后果:

不可重入的后果主要体现在象信号处理函数这样需要重入的情况中。如果信号处理函数中使用了不可重入的函数,则可能导致程序的错误甚至崩溃。

 

Ø         可重入与线程安全

可重入与线程安全并不等同,一般说来,可重入的函数一定是线程安全的,但反过来不一定成立。它们的关系可用下图来表示:

 

比如:strtok函数是既不可重入的,也不是线程安全的;加锁的strtok不是可重入的,但线程安全;而strtok_r既是可重入的,也是线程安全的。

 

 

来自:http://www.top-e.org/jiaoshi/html/?189.html

惯性导航原理(九)-INS的初始对准-初始姿态确定+双矢量定姿 文章目录INS的初始对准INS初始化静基座/静态粗对准静态粗对准—加速度计调平原理加速度计调平静态粗对准—陀螺罗盘思考初始对准的影响因素双矢量定姿原理静态解析粗对准—双矢量定姿静态解析粗对准(续)其它初始对准方法精对准动对准 INS的初始对准 INS的初始对准为初始化的一部分 INS初始化 初始位置: 给定(INS没有初始位置确定的能力,例如从GPS ) 初始速度: 零(静止状态)或给定 初始姿态: 初始对准(INS有能力自己测资态) 粗对准vs. 精对准 静止状态vs. 运动状态 重要性: 失之毫厘,谬 阅读详情

相关推荐

maxwell与steady state thermal 通过workbench耦合仿真

文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai

roymustang的博客 9199

线程安全和可重入函数

先说结论 可重入函数未必是线程安全的;线程安全函数未必是可重入的。 可重入函数的概念 可重入的程序(函数)允许在执行的过程中被打断,并在打断所执行的代码中再次安全的调用。 若一个函数是可重入的,则该函数应当满足下述条件: 不能含有静态(全局)非常量数据。 不能返回静态(全局)非常量数据的地址。 只能处理由调用者提供的数据。 不能依赖于单实例模式资源的锁。 调用(call)的函数也必需是可重入的。 总之一句话:上述条件就是要求可重入函数使用的所有变量都通过函数的调用者提供。 举例说明,设计一个发送字符串

sinat_31039061的博客 2663

CentOS7下Node.js v20+安装与常见依赖库问题解决指南

本文详细介绍了在CentOS7系统下安装Node.js v20+的完整流程及常见依赖库问题的解决方案。通过升级glibc到2.28+、配置环境变量以及处理libstdc++版本问题,帮助开发者顺利在老旧系统上部署最新版Node.js,提升开发效率。

weixin_30689307的博客 156

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

1.关于可重入函数 当捕捉到信号时,不论进程的主控制流程当前执行到哪,都会先跳到信号处理函数中执行,从信号处理函数返回后再继续执行主控制流程。信号处理函数是一个单独的控制流程,因为它和主控制流程是异步的,二者不存在调用和被调用的关系,并且使用不同的堆栈空间。引入了信号处理函数使得整个进程具有多个控制流程,如果这些控制流程访问相同的全局资源(全局变量、硬件资源等),就有可能出现冲突。 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它

tugouxp的专栏 403

【C#】控制设备管理器中设备的启用/禁用_20220506

通过C#代码实现设备管理器的启用/停止 引入Manamger程序集,查找到所需设备,控制启停

weixin_45475139的博客 4527

告别混乱代码!在Arduino IDE中管理多文件项目的5个必备技巧

本文分享了在Arduino IDE中管理多文件项目的5个必备技巧,帮助开发者告别混乱代码。通过代码分割和模块化设计,提升编译效率、降低内存占用,并实现功能解耦。重点介绍了头文件设计、CPP文件实现、调试技巧和工业级目录结构,让你的Arduino项目像乐高积木一样清晰易维护。

fun88的博客 360

可重入函数与线程安全

在前面的学习中,我们已经介绍过了可重入函数,下面我们先来复习一些基本的概念:重入:即重复进入。同一个函数被不同的执行流调用,有可能出现第一次调用还未返回,就再次进入该函数开始了下一次的调用。可重入:函数可由多个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行时并不会丢失数据。可重入性解决函数运行结果的确定性和可重复性。可重入函数:如果一个函数只访问自己的局部变量或参...

Cecilia3333的博客 284

openbmc 支持mctp over pcie(二)

本文介绍了在OpenBMC系统中实现MCTP over PCIe的社区方案,主要针对AMD CPU和Intel CPU平台。方案基于社区开发的mctpd应用层和内核驱动,通过修改设备树(dts)配置内存区域,并编译Linux内核模块。验证时可通过查看/proc/net/protocols确认MCTP协议支持,使用ip addr命令检查mctppci0网络接口状态。相关代码和文档参考了AspeedTech和CodeConstruct的GitHub仓库。该方案为BMC作为MCTP端点提供了标准化实现方法。

wit_yuan的专栏 376

线程安全与可重入函数

一,什么是线程安全?1,线程安全就是说多线程访问同一代码,不会产生不确定的结果。换句话说,线程安全就是多线程访问时,采用加锁机制,当一个线程访问该类的某个数据时,用锁对数据进行保护,其他线程不能访问该数据直到该线程读取完,其他线程才可使用,线程安全不会出现数据不一致或者数据污染。反之, 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。2,举个例子: 比如说

snow_5288的博客 1682

解决开着代理情况下pip或魔搭下载失败

最近由于经常配环境导致,老是要来回切clash关掉代理,非常的不方便如下面的,魔搭模型下载失败如下面的,pip换源后下载失败。

风吹落叶的博客 2949

Python爬虫实战:使用最新技术爬取新浪新闻首页数据

本文详细介绍了三种爬取新浪新闻首页的技术方案,从简单的requests-html到强大的Playwright,再到分布式Scrapy架构。小规模爬取:requests-html或aiohttp方案需要JavaScript渲染:Playwright方案大规模分布式爬取:Scrapy-Redis方案。

2201_76125261的博客 1243

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

线程安全线程安全是多个线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取结束并且释放了锁,其他线程才可使用,保证了数据的一致性。与之对应的则是线程不安全,对数据的访问不提供保护机制,导致多个线程先后更改数据造成数据的不一致问题,这是一个非常严重的问题。从之前的二元信号量到生产者消费者模型都存在很严重的线程不安全问题,不过那只是线程安全性问题的一...

ypt 3848

一个中科大差生的8年程序员工作总结

今年终于从大菊花厂离职了,离职前收入大概60w不到吧,在某乎属于比较差的,今天终于有空写一下自己的职场故事,也算是给自己近8年的程序员工作做个总结复盘。近8年有些事情做对了,也有更多事情做错了,在这里记录一下,希望能够给后人一些帮助吧,也欢迎私信交流。文笔不好,见谅,有些细节记不清了,如果有出入,就当是我编的这个故事吧。 PS:有几个问题先在这里解释一下,评论就不一一回复了 1、关于差生,我本人在科大时确实成绩偏下,差生主要讲这一点,没其他意思。 2、因为买房是我人生中的大事,我认为需要记录和总结一下

陈小房的自我修炼 5万+

C:可重入函数 & 线程安全函数

线程安全:简单来说线程安全就是多个线程并发同一段代码时,不会出现不同的结果,我们就可以说该线程是安全的。 线程安全产生的原因:大多是因为对全局变量和静态变量的操作。 常见的线程不安全的函数: (1)不保护共享变量的函数; (2)函数状态随着被调用,状态发生变化的函数; (3)返回指向静态变量指针的函数; (4)调用线程不安全函数的函数; 常见的线程安全的情况: (1)每个线程对全局...

鱼藏剑 1741

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

*****可重入函数        函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入。在进行链表的插入时,insert函数访问一个全局链表,有可能因为重入而造成错乱,像这样的函数称为不可重入函数,反之,如果一个函数只访问自己的局部变量或参数,则称为可重入(Reentrant) 函数。 重入:即重复调用,函数被不同的流调用,有可能会出现第一次调用还没

Scenlyf的博客 5362

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

可重入函数:一个函数可以在任意执行流中调用,都不会出问题。 线程安全函数:一个函数在任意线程中调用,都不会有问题。 区别: 可重入包含更高,覆盖了线程安全。 如果一个函数是可重入函数,一定是线程安全的;一个函数线程安全,不一定可重入函数。 代码示例: #include <stdio.h> #include<pthread.h> //头文件 #include...

陌上人如玉,公子世无双。 531

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

线程安全函数  • 概念:  线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。  • 确保线程安全:  要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄 存器。因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而

crazy_programmer_p的专栏 733

【Linux】线程安全与可重入函数

【Linux学习】:在Linux的一段时间学习中,刚开始是模糊的,所以很久没有进行博客的整理,直到最近自己把Linux的学习从前往后回忆与联系清楚了,觉得是时候整理成博客,变为自己的学习笔记了,先从线程安全和可重入函数整理,一方面是趁热打铁,另一方面是在这篇博客中,其实嵌套着前面的学习!第一部分: 线程安全最直接的概念,不管是从网上查阅资料还是书上看到的,都会有这么一句:一般来说,一个函数是线程安全

John的博客 1522

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

本文主要介绍一下可重入函数与线程安全的区别与联系,在此之前我们先来了解一些基本概念:什么是线程全函数,什么是可重入函数? 线程安全函数 概念 线程安全的概念比较直观,一般来说,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。 确保线程安全 要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一线程的不同进程会共

qq_29503203的博客 1189
上一篇: 读Kernel感悟-Linux内核启动-从hello world说起
下一篇: 嵌入式C++——关于C++的效率分析
TopEmbedded
博客等级 码龄18年 58粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值