- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人问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/
有人问set_new_handler 在多线程环境下是否安全。我想知道 C++11 和更高版本的 C++ 标准库实现是否使用 thread_local 功能来存储 std::new_handler。如
C++ 程序可以定义和设置 new_handler(),如果无法分配请求的内存,则应从内存分配函数(如 operator new())调用该函数。 自定义 new_handler() 的一个用途是 d
每当我们使用 set_new_handler (std::new_handler handle_mem_alloc) 来处理内存分配失败时,如果发生任何内存分配失败,那么 handle_mem_all
这是 new 运算符的伪代码: while (true) { Attempt to allocate size bytes if (the allocation was success
我遇到了一个小的标准头文件 .我以前可能没有看到它的直接使用。这是 the g++ version对于那些有兴趣的人。 下面是我感兴趣的部分: struct nothrow_t { }; e
我是一名优秀的程序员,十分优秀!