gpt4 book ai didi

c++ - set_new_handler 是否将 new_handler 存储在线程本地存储中?

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

有人问set_new_handler 在多线程环境下是否安全。我想知道 C++11 和更高版本的 C++ 标准库实现是否使用 thread_local 功能来存储 std::new_handler。如果实现不使用 thread_local,为什么不呢?这似乎会使该功能在多线程程序中更加健壮。

我也不太明白 set_new_handler 将如何用于重载 new 并设置 std::new_handler 并创建的类(并拥有对)一个对象,该对象还重载 new 并设置其自己的 std::new_handler。我希望如果拥有类可以选择获取/释放内存,而拥有的对象决定调用中止/终止,那将特别令人震惊。

我希望通常的建议是使用 nothrow 版本的 new 而忘记 set_new_handler。如果这是普遍的看法,为什么 set_new_handler 不是标准库中已弃用的功能?

最佳答案

new_handler 不是,也从没想过会是线程局部构造。它始终是全局性的,这是设计使然。

新的处理程序旨在设置一次并保持不变;它不适用于单个执行线程本地的临时更改。您可以通过创建一个新的处理程序来为自己构建这样的设施,该处理程序将其操作推迟到您的代码可以设置的 thread_local 变量。但 C++ 新处理程序功能本身并不适用于此类用例。

现在,可以说这是一项遗留决定。 C++98/03的内存模型没有考虑线程的可能性。因此,任何 C++11 之前的线程实现基本上都自行决定哪些操作是线程安全的、线程局部的,等等。决定将 new-handler 实现为全局构造的实现与将其作为每个线程的实现一样正确。事实上,实现可能在某个时候选择了全局选项,而 C++11 刚刚采用了它。将其更改为线程本地会破坏人们的代码。

但与此同时,新处理程序的意义在于允许用户更改分配失败的默认处理方式。默认错误处理不是线程本地概念;这是整个程序中普遍存在的东西。与终止函数等非常相似,恰好有一个预期会被使用。

简单地说,即使在 C++98/03 时代,使用局部类新处理程序的代码在某种程度上总是错误的。只是在 C++11 标准化线程之前,它是您可以摆脱的东西(至少就标准而言)。它并没有被弃用,因为它对于其预期目的很有用nothrow 只在本地有用; set_new_handler 在全局范围内都很有用。

关于c++ - set_new_handler 是否将 new_handler 存储在线程本地存储中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57837645/

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