线程安全与可重入

我用 AI Agent 全自动跑 COMSOL 仿真:从建模到后处理,踩了 10+ 个深坑 本文探讨了利用AI通过COMSOL Java API实现AI芯片液冷冷板全流程自动化仿真的实践。针对700W高功耗AI芯片的散热需求,构建了包含4颗Chiplet和微通道冷板的三维液冷模型。通过严格设计的Prompt工程,AI Agent成功完成了从几何建模到结果验证的全过程,最终实现了芯片最高温度54°C的良好散热效果。文章重点分享了10个关键问题的解决经验,包括流体连通性验证、网格顺序控制、离散阶数选择、收敛判据优化等,并建立了包含流场/热场/网格独立性的三重验证体系。实践表明,AI可高效处理重复性工作 阅读详情
  • 定义

  线程安全:被多个并发的线程反复调用时,他会产生正确的结果。

  可重入:当被多个线程调用的时候,不会引用任何共享数据。

  Remark:任何线程不安全问题的根源都是“共享数据”。所以,不使用任何共享数据的函数(即:可重入函数)肯定是线程安全的。但这并不等于说,线程安全函数就是可重入函数。为什么呢?因为:即使有线程有共享数据,线程被并发调用的时候产生的结果可以是正确的。那么这种正确性是如何保证的呢?对,就是通过同步操作。

  •  线程不安全的根源

  上面已经提到,线程不安全的根源在于:共享数据。

  共享数据可以是:

  1. 函数把返回结果放到一个公共的位置
  2. 由调用者传入的线程间共享的指针变量或者引用变量
  3. 函数内部本来就会使用的共享静态变量
  •  线程不安全怎么能够改写成线程安全

  无非有两种策略:

  1. 仍旧使用共享数据,但是在使用共享数据的时候做同步操作。对于函数过程中使用的共享数据,可以进行简单的PV操作,对于返回结果可以在PV操作中把共享数据拷贝到非共享的位置,以便及时释放共享变量。
  2. 杜绝使用共享变量。也就是说把函数改成了可重入的函数。但是,彻底杜绝共享变量有的时候不容易做到。对于上面的提到的第一种和第三种情况很容易做到,但是对于第二种情况,我们没有办法。所以,对于一个不接受引用和指针的函数,我们可以把它做到绝对的可重入,但是,对于一个接受指针或者引用的函数来说,对不起,我们不能确保他肯定是可重入的。
  •  关于性能

  通常来说,多线程是为了在同一时间内能够处理更多的同样类型的事情,但是线程不安全却阻碍了我们达到我们的目的。所以,我们有的时候不得不想方设法的把线程不安全的函数改写成线程安全的。

  改写的结果无非两种,一种是原函数的“同步版本”,一种是原函数的“可重入版本”。可重入版本相比前者的从性能上来说有着天然的优势,这种优势就是在于它不涉及PV操作,不存在软件上的瓶颈,可以最大化的利用硬件资源。然而“同步版本”则有可能不能充分利用硬件的资源,因为程序在等待资源的释放。

  • 关于重写的策略

  拿到一个线程不安全函数是一件郁闷的事情。但是有的时候你必须要使用它,那怎么办呢?这个时候就要从上面提到的三个可能的共享数据来入手了:

  1. 如果调用函数的返回结果是共享的,这个时候就要使用上面蓝色字体提到的lock-and-copy方法,在PV操作中,把结果转移到非共享的区域。
  2. 尝试在调用函数的时候不使用引用或者指针,如果函数在多线程工作的时候结果正确了,则为题解决了,否则,问题可能出现在函数内部,转3
  3. 找到这个函数的共享变量,对其做PV操作。什么,你没有源代码?“男人,哭吧,哭吧,不是罪……”
从零到一:Qt与PCL的跨平台开发环境搭建全攻略 本文详细介绍了从零开始搭建Qt与PCL跨平台开发环境的完整流程,涵盖Windows、Linux和macOS三大平台。重点解析了Qt5与Qt6版本选择、PCL库安装配置、VTK集成等关键技术要点,并提供跨平台CMake项目模板和常见问题解决方案,助力开发者快速构建三维点云处理应用。 阅读详情

相关推荐

Burp靶场实战:JWT签名绕过漏洞分析与利用

本文通过Burp Suite靶场实战,深入剖析了JWT签名绕过漏洞的多种攻击手法,包括签名未验证、alg:none攻击、弱密钥爆破、JWK/JKU头注入、KID路径遍历及算法混淆攻击。文章详细演示了利用过程,并提供了关键的防御指南,帮助开发和安全人员加固JWT实现,确保认证安全。

weixin_29325515的博客 601

python多线程编程(4): 死锁和可重入锁

死锁 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子: # encoding: UTF-8import threadingimport timeclass MyThread(threading.Thread): def do1(self): glob...

weixin_33913332的博客 206

原形网络(Prototypical Networks)基于PyTorch的实现

我在Jay2coomzz的基础上修改了数据处理方式和evaluation_model()方法,作为初学者若有不当之处恳请大家批评指正,原文链接如下: https://blog.youkuaiyun.com/weixin_38471579/article/details/102631018 数据集和源码链接将放到评论区 文章目录1 数据集一个简单的数据集介绍数据集处理2 搭建网络CNNProtonets 1 数据集 一个简单的数据集介绍 Omniglot数据集一共包含1623 类手写体,每一类中包含20 个样本。其中.

weixin_43872532的博客 6637

ZZ可重入与异步信号安全

可重入与异步信号安全From:http://blog.chinaunix.net/u/12592/showart_1871048.html一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。《多线程编程指南》中定义,可以被信号控制器安全调用的函数被称为"异步信号安全"函数。因此,我认为可

自由程序员 726

免费AI视频生成全流程:通义千问+Seedance 2.5+Grok实战指南

AI视频生成正在成为内容创作的重要方式,但高昂的API费用常让个人创作者望而却步。实际上,通过合理组合云端免费工具,也能搭建一条完整的视频生产链路:利用大模型生成脚本,用视频生成模型将文本渲染成画面,再借助多模态模型进行一致性校验。这种“文本+视频+多模态”的协作模式,将复杂的生成任务解耦为可独立调用的模块,既降低了本地硬件要求,也为批量内容验证提供了低成本方案。该流程适用于短视频素材快速产出、产品Demo验证以及AI应用集成等场景,核心在于打通免费账号、API调用与批量任务调度。本文以通义千问、Seeda

weixin_29044157的博客 386

退火朗之万动力学采样

退火朗之万动力学采样(Simulated Annealing Langevin Dynamics Sampling)结合了退火技术和朗之万动力学,是一种用于分子模拟和统计物理中的计算方法。这种方法可以帮助系统从局部最小值中逃逸,以找到全局最小值或进行有效的配置空间探索。

weixin_39699362的博客 1951

可重入函数和线程安全

可重入函数和线程安全 1.线程安全 线程安全:当一个函数被多个并发进程反复调用时,它会一直产生正确而的结果,称其为线程安全的。 若一个函数不是线程安全的,就称其为线程不安全的。 线程安全就是说多线程访问同一代码,不会产生不确定的结果。换句话说,线程安全就是多线程访问时,采用加锁机制,当一个线程访问该类的某个数据时,用锁对数据进行保护,其他线程不能访问该数据直到该线程读取完,其他线程才可

agate_zhang的博客 547

4.7W防削顶单声道D类音频功率放大器HT6872介绍

HT6872是一款低EMI,防削顶失真,单声道免滤波D类音频功率放大器。在6.5V电源,10%THD+N,4Ω负载条件下,输出4.71W功率,在各类音频终端应用中维持高效率并提供AB类放大器的性能。

weichen_78的博客 4703

关于异步信号安全

关于异步信号安全 线程安全与重入以及异步信号安全的区别. 可重入一定是线程安全的,但是线程安全不一定是可重入的. 引用别人的博客中的话吧.如下: http://blog.youkuaiyun.com/xiaofei0859/article/details/5818511 线程安全: 线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态...

weixin_33918357的博客 242

Xilinx的DDR4 IP

Xilinx的DDR4 IP

weixin_39896700的博客 4460

无人机中继传输数据链技术,(无人机+自组网)远距离传输技术实现详解

无人机中继传输数据链技术是指利用无人机作为空中移动中继节点,在需要通信的区域上空悬停或移动,以建立和维护通信链路,从而扩展通信范围、提高通信质量和灵活性。1. 通信链路:是无人机中继通信的重要组成部分,包括源节点到中继节点的链路和中继节点到目标节点的链路。同时,它还支持空中到地面的通信,距离大于100km。总的来说,无人机中继传输数据链技术和(无人机+自组网)远距离传输技术都是现代无人机通信领域的重要技术,它们的应用极大地扩展了无人机的通信范围和灵活性,为各种应用场景提供了强有力的支持。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 2079

浅谈可重入与线程安全

但是,如果在单线程背景下第一次执行该函数时已经获得互斥锁进入临界区,这时该函数被重入执行,这将在重新申请互斥锁时被饿死(starvation),因为获得了互斥锁的该函数的第一次执行将永远没有机会再获得CPU时间片。以上代码中,f使用了全局变量 g_var,所以,如果两个线程同时执行它并访问g_var,则返回的结果取决于执行的时间。多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。但是,他们有重大区别。

玖玖玖 1141

华为OD机试双机位A卷 - VLAN资源池 (C++ & Python & JAVA & JS & GO)

华为OD机试2025双机位A卷 VLAN资源池,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 879

线程安全与可重入函数

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

snow_5288的博客 1682

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

虽然可重入函数通常是线程安全的,但线程安全的函数未必是可重入的。例如,某个函数使用了锁来确保线程安全,但它在执行时持有锁,这就意味着它不能在信号处理程序或中断中被安全调用,因此它不是可重入的。的函数是指能够在被中断后,再次从头开始执行而不会影响其正确性的函数。换句话说,如果在一个可重入函数的执行过程中,出现了新的调用(无论是来自同一线程还是另一个线程),函数的执行仍然是正确的。是两个重要概念,它们都与程序在多线程环境下的正确性有关。指的是代码能够在多个线程并发访问的情况下仍能保持正确的行为。

2403_86785171的博客 1451

pscad IEEE标准系统搭建说明

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

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

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

ypt 3849

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【一文搞懂可重入与线程安全的关系】

在多线程或中断环境中能够被安全调用的函数。1、如果函数使用了全局或静态变量,多个线程或中断可能同时修改它,导致数据竞争。可重入函数不会使用这些变量,或者在使用时采取保护措施(例如传递局部变量或锁定访问)。2、如果一个函数调用了非线程安全函数,那么它本身也不是可重入的。3、所有需要的数据都存储在局部变量或通过参数传递,以确保线程间互不干扰。4、避免在函数内部使用像 malloc 或 free 这样的静态内存分配方法。

did_you的博客 1371

可重入函数与线程安全

重入:当不同的控制流程调用同一个函数时,有可能当一个调用还没返回时,另一个调用就进入了该函数,将其称作重入; 不可重入函数:当一个函数由于可重入出错,则将此函数称为不可重入函数; 可重入函数:当一个函数由于可重入而不影响正确结果(其只访问自己的局部变量和参数),将此函数称作可重入函数; 举例:常见情况中,当程序正在执行到某一个函数中的某一条指令时,这时其收到了一个信号,于是其暂停执行去处理信

L_XRUI的博客 953

线程安全和可重入函数

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

sinat_31039061的博客 2663

线程安全与可重入总结

总结: ①可重入函数一定是线程安全的; ②可以通过加锁将不可重入函数变成线程安全的; ③线程安全的函数不一定是可重入的; 解释: 根据正常情况,当一个信号发生时,如果进程并没有对该信号进行屏蔽,信号 可能在任意时候打断一个进程的任意一个线程而执行。 一个函数可以是可重入的,也可以是线程安全的,也可以两者都是,或者两者都不是。 1、可重入函数:相对于信号而言,如果该函数A1正在执行过程

HN_gsf的博客 970

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

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

qq_29503203的博客 1189

C++面试题之线程安全与可重入

线程安全是一种适用于多线程代码的计算机编程概念。线程安全代码仅以确保所有线程正常运行并满足其设计规范的方式操作共享数据结构,而无需意外交互。有多种策略可用于创建线程安全的数据结构。程序的多个线程可以再共享地址空间中同时执行代码,其中这些线程中的每一个都可以访问其他线程的几乎所有内存。线程安全是一种属性,它允许代码在多线程环境中运行,方法是通过同步重新建立实际控制流与程序文本之间的一些对应关系。也就是说,线程安全问题是由于线程之间存在临界资源(内存映射是共享的),从而引出诸如临界区、互斥/竞争访问的概念。

草上爬的博客 3001

<<apue>> 可重入和线程安全

回顾 什么是可重入? 线程安全函数 如果一个函数,对于多个线程来说是可重入的,那么这个函数就是线程安全的 异步信号安全 如果函数对于异步信号处理成序的重入是安全的,那么该函数就是异步信号安全的 包含关系 可重入与线程安全两个概念都关系到函数处理资源的方式。但是,他们有重大区别: 可重入函数要解决的问题是,不在函数内部使用静态或全局数据,不返回静态或全局数据,也不调用不可重入函数。 线程安全函数要解决的问题是,多个线程调用函数时访问资源冲突。 ① : 函数如果使用静态变量,通过加锁后可以转成线程安

jiewaikexue的博客 675

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

可重入函数与线程安全函数顶嵌(TOP-E)|嵌入式linux企业培训|嵌入式Linux就业实训|承接嵌入式项目开发   2009-01-23 12:02:59 作者:顶嵌开源 来源:原创 文字大小:[大][中][小]可重入函数(reentrant function)与线程安全函数(thread-safe function)有时

李亚锋老师 1282
上一篇: java多线程总结
下一篇: Java:单例模式的七种写法
codepython
博客等级 码龄20年 125粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值