为什么说malloc()和printf()是不可重入的?

2024-03-22

在 UNIX 系统中我们知道malloc()是不可重入函数(系统调用)。这是为什么?

相似地,printf()也被认为是不可重入的;为什么?

我知道可重入的定义,但我想知道为什么它适用于这些函数。 是什么阻止了它们保证可重入?


malloc and printf通常使用全局结构,并在内部采用基于锁的同步。这就是为什么它们不可重入。

The malloc函数可以是线程安全的,也可以是线程不安全的。两者都是不可重入的:

  1. Malloc 在全局堆上运行,并且有可能两次不同的调用malloc同时发生,返回相同的内存块。 (第二次 malloc 调用应该在获取块的地址之前发生,但该块未标记为不可用)。这违反了后置条件malloc,所以这个实现不会是可重入的。

  2. 为了防止这种影响,线程安全的实现malloc将使用基于锁的同步。但是,如果从信号处理程序调用 malloc,则可能会发生以下情况:

    malloc();            //initial call
      lock(memory_lock); //acquire lock inside malloc implementation
    signal_handler();    //interrupt and process signal
    malloc();            //call malloc() inside signal handler
      lock(memory_lock); //try to acquire lock in malloc implementation
      // DEADLOCK!  We wait for release of memory_lock, but 
      // it won't be released because the original malloc call is interrupted
    

    这种情况不会发生,当malloc只是从不同的线程调用。事实上,可重入的概念超出了线程安全的范围,还需要函数才能正常工作即使它的调用之一永远不会终止。这基本上就是为什么任何带锁的函数都不可重入的原因。

The printf函数也对全局数据进行操作。任何输出流通常都会使用附加到要发送到的资源数据的全局缓冲区(用于终端或文件的缓冲区)。打印过程通常是将数据复制到缓冲区并随后刷新缓冲区的序列。该缓冲区应该以同样的方式受到锁的保护malloc做。所以,printf也是不可重入的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么说malloc()和printf()是不可重入的? 的相关文章

  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • std::bind 重载解析

    下面的代码工作正常 include
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • Code First 实体框架为主键列名称添加下划线

    我有一个域类的流畅映射 它定义了每列的名称 包括由两列组成的主键 NotificationId 和 IdentityId 这些也是分别指向Notification Id和Identity Id的外键 每当我使用此映射作为查询的一部分时 它都
  • 解决具有最大变量的优化问题

    原始问题 在给定收益矩阵的情况下找到玩家一的最佳混合策略 0 2 1 1 3 4 0 5 1 3 0 2 1 1 2 1 我有以下最大化问题 最大电压 s t3p1 p3 2p4 2p1 4p2 3p3 p4 p1 2p4 p1 5p2 2
  • Symfony 3 - 将控制器代码外包到服务层

    我对 Symfony 3 很陌生 我想避免 我的控制器中的业务逻辑 到目前为止我所做的是
  • 正则表达式获取VB.Net源代码中的注释

    我在 vb net 中有一个语法高亮功能 例如 我使用正则表达式来匹配 IF 然后将其着色为蓝色 在我尝试弄清楚如何进行评论之前 这一切都很完美 我为评论编写的语言可以是如果该行以单引号 开头 或者如果该行中的任何位置有两个单引号 this
  • 使用非可选但可能未定义的字段指定 Zod 架构

    是否可以使用可能的字段定义 Zod 模式undefined 但不是可选的 在 TypeScript 中 这是以下之间的区别 interface IFoo1 somefield string undefined interface IFoo2
  • Callkit可以与非voip通话一起使用来获取ios中的通话状态吗?

    我已阅读有关进行非 voip 呼叫的问题 看来开放网址是唯一的方法 由于 CoreTelephony 已被弃用 当使用开放的 url 进行呼叫时 是否可以使用 Callkit 来获取呼叫状态 如果没有 有什么方法可以以编程方式获取呼叫状态
  • Margin-Top 将外部 div 向下推

    我有一个标题 div 作为包装 div 中的第一个元素 但是当我向标题 div 内的 h1 添加上边距时 它会将整个标题 div 向下推 我意识到每当我将上边距应用于页面上的第一个可见元素时就会发生这种情况 这是一个示例代码片段 谢谢 di
  • Javascript:无法播放wav文件

    基于 StackExchange 的代码 我编写了打开 wav 文件的代码 wav 文件本身是一个有效的文件 因为它可以与我的 Python 程序一起正常播放 但 javascript 函数不起作用 声音文件与我的 html 文件位于同一文
  • Content-Id header的精确格式

    当谈到格式时我真的很困惑Content Id消息部分中的标头 在我看来 只有RFC 2045 https www rfc editor org rfc rfc2045 section 7涵盖了标头的格式 但很简短 在构建高级用户代理时 可能
  • 构造函数内部与外部的 JavaScript 类属性

    我正在努力理解在构造函数内部和外部定义属性之间的区别 在下面的示例中 两个属性都可以以相同的方式在实例上访问 有什么区别 class Foo constructor this bar 1 baz 1 const foo new Foo co
  • CloudKit 在不同 iCloud 帐户之间共享数据,但并非与所有人共享数据

    在我的应用程序中 我想通过 iCloud 与其他 iCloud 用户共享数据 但不是与全世界共享数据 而是与选定的其他 iCloud 用户共享数据 我想过一种可行的方法 但我不确定它是否可行 以及我是否忘记或误解了一些事情 假设用户 A 希
  • CakePHP 2.x Containable 内的 GROUP BY

    我正在疯狂地尝试找到一个好的解决方案 要么使用set extract 或者其他的东西 我想在我的容器中添加一个 GROUP BY params array conditions gt array Project id gt ProjectI
  • PHP - 使用 ADBDB 同时连接到同一服务器上的两个数据库

    是否可以使用 PHP 5 3 ADODB5 SQL Server 2008 在同一服务器上打开与两个模式的连接 这就是我正在尝试的 Connect to users database connUsers NewADOConnection m
  • 使用 NSPersistentStoreCoordinator 的要点是什么?

    在核心数据讲座中斯坦福193P http www stanford edu class cs193p cgi bin drupal iTunes 上的 iPhone 课程 讲师使用 Core Data 编写了一个示例项目 而没有使用NSPe
  • Hibernate二级缓存-打印结果

    我使用 Cache 注释在应用程序中定义了二级缓存 我正在使用 findById 查询 如下所示 long id 4 Company cmp companyDAO findById id 其中 Company 是我从数据库获得的对象 如何检
  • Spring Boot 和 Ehcache - 多 CacheException

    我正在尝试向 springboot 应用程序添加缓存 但遇到了启动过程中引发 org ehcache jsr107 MultiCacheException 异常的问题 我正在使用以下内容 全部通过 Maven pom 文件加载 Spring
  • Python - 什么时候可以使用 os.system() 发出常见的 Linux 命令

    从另一个线程中分离出来 什么时候适合使用 os system 发出 rm rf cd make xterm ls 等命令 考虑到上述命令有模拟版本 make 和 xterm 除外 我假设使用这些内置 python 命令而不是使用 os sy
  • Seaborn:ValueError:调色板='jet'否

    从seaborn运行以下示例docs https seaborn pydata org generated seaborn boxplot html有论据palette jet import seaborn as sns tips sns
  • 金字塔资源:简单的英语

    我一直在阅读对新创建的金字塔应用程序实施授权 和身份验证 的方法 我不断遇到 资源 这个概念 我在应用程序中使用 python couchdb 根本不使用 RDBMS 因此没有 SQLAlchemy 如果我像这样创建一个 Product 对
  • 为什么说malloc()和printf()是不可重入的?

    在 UNIX 系统中我们知道malloc 是不可重入函数 系统调用 这是为什么 相似地 printf 也被认为是不可重入的 为什么 我知道可重入的定义 但我想知道为什么它适用于这些函数 是什么阻止了它们保证可重入 malloc and pr