柴小超 2021-06-29 18:27 采纳率: 57.1%
浏览 12

请问如下代码到底是线程不安全还是不可重入呢

 int g_var = 1;
 
 int f()
 {
   g_var = g_var + 2;
   return g_var;
 }
 
 int g()
 {
   return f() + 2;
 }

维基上是这么说的:

以上代码中,f使用了全局变量 g_var,所以,如果两个线程同时执行它并访问g_var,则返回的结果取决于执行的时间。因此,f不可重入。而g调用了f,所以它也不可重入。

但是,维基上又说:与多线程并发执行的线程安全不同,可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。

  • 可重入是在单线程操作系统背景下,重入的函数或者子程序,按照后进先出的线性序依次执行完毕。
  • 多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。

按这样说的话,那“如果两个线程同时执行它并访问g_var,则返回的结果取决于执行的时间。”这句话想表示的应该是 f 和 g 两个函数不是线程安全的啊,因为它说的是两个线程啊,可重入不可重入不是针对一个线程而言的吗?为什么说这两个函数是不可重入的呢?

  • 写回答

2条回答 默认 最新

  • qfl_sdu 2021-06-29 18:35
    关注

    它的意思应该是如果这两个函数在不同的线程中,这两个函数是不可重入的。

    前提是,函数在不同的线程中

    评论

报告相同问题?

悬赏问题

  • ¥15 求一款免费的pdf编辑js,web端用的
  • ¥15 申威平台是否兼容使用cmake,需要cmake版本在3.15版本以上
  • ¥20 UE5.2插件Remote Control Web Interface安装失败问题
  • ¥15 c#调用c++方法提示错误 无法封送处理泛型类型
  • ¥15 求分析下图晶体与三极管组成的振荡电路
  • ¥100 多线程+连接池+代理 运行一段时间线程阻塞
  • ¥15 关于#单片机#的问题:求一个使用C语言将重力加速度gx,gy,gz积分获取到速度的代码(相关搜索:c语言)
  • ¥15 matlab导致电脑重启问题
  • ¥15 Android studio打开dex
  • ¥20 为何R语言love图显示的分类变量点与smd值不一致