在信号处理程序中使用`std::shared_ptr`和`std::weak_ptr`是否安全?

3
我知道从信号处理程序直接或间接地调用mallocfree是不安全的。

但是,如果我可以保证至少有一个共享引用仍然存在,那么复制构造和销毁其他共享或弱引用是否安全?还是必须自己编写引用计数器?

(是的,我知道信号处理程序通常不应该做太多事情。但这次我有充分的理由。)

1个回答

7
C++标准将“普通函数”定义为以下概念:

POF(“普通函数”)是仅使用[C/C++]公共子集中的特性且不直接或间接使用任何非POF函数的函数,但它可以使用纯粹的无锁原子操作。

此外:

在C++程序中,除了POF之外的任何函数用作信号处理程序的行为都是实现定义的。

显然,C++类对象不属于C/C++公共子集,因此在信号处理程序中使用它们会产生实现定义的行为。
现在,许多实现将允许您有限地使用C++特性。如果您的实现不允许内存分配或异常,则以下是我们对这些智能指针类型的了解。
然后,所有weak_ptr构造函数都明确声明为noexcept。因此它们不能抛出异常。这也意味着它们不允许分配内存(因为无法分配内存会引发异常)。是的,它们可以分配内存并在失败时std::terminate,但实现这样做会非常粗鲁。

shared_ptr的复制和移动构造函数同样是noexcept,因此同样适用。这也适用于shared_ptr的别名构造函数。

如果您绝对确定至少还存在一个shared_ptr,那么销毁shared_ptr被明确说明不会产生副作用。这可能包括内存释放。

这些是标准库给您的保证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接