gpt4 book ai didi

c++ - 以符合 C++ 标准的方式实现 std::malloc

转载 作者:行者123 更新时间:2023-11-28 01:24:05 26 4
gpt4 key购买 nike

在回答问题之前进行快速思考实验。想象一下有人正在实现 std::malloc(例如,JEMalloc 或 TCMalloc 人员之一)。他们需要的最基本的东西之一是能够知道一旦执行进入 std::malloc 的实现,程序将不会回调到 malloc。

例如,

void* malloc(...) {
auto lck = std::unique_lock{malloc_mutex};
// .. memory allocation business logic
}

现在如果在锁和分配的业务逻辑之间有一个信号,如果信号处理程序回调到 std::malloc,我们就可以死锁。它不是设计为可重入的,C++ 标准要求使用 std::signal 注册的信号处理程序不会回调到 operator new(它可能会回调到 malloc,因此需要用户定义的信号如果处理程序被认为可以跨所有语言实现移植,则处理程序不会回调到 malloc。

§[support.signal]p3 在最新版本的标准中概述了这一要求

  1. An evaluation is signal-safe unless it includes one of the following:

a call to any standard library function, except for plain lock-free atomic operations and functions explicitly identified as signal-safe. [ Note: This implicitly excludes the use of new and delete expressions that rely on a library-provided memory allocator. — end note ]


但是,C++ 标准似乎没有说明如何为执行线程实现函数堆栈(参见这个问题:C++ threads stack address range),这意味着 std::malloc 实现中的函数分派(dispatch)可能会调用 operator new 如果程序是用分段堆栈编译的。

在那种情况下,如何实现像 std::malloc 这样的函数?如果确实,C++ 标准不提供这样的保证,那么什么提供呢?我们怎么知道一个常规函数的执行经过了常规的栈分配过程(栈指针递增)?哪个标准(例如 ABI、编译器、POSIX)涵盖了这一点?

最佳答案

实现需要为其堆栈帧使用信号安全分配器。这是因为允许信号处理程序中的函数调用(对非库函数)。实现可以使用 mallocoperator new,但前提是这些分配器本身是信号安全的。

关于c++ - 以符合 C++ 标准的方式实现 std::malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54743078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com