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

Is it safe to use `std::shared_ptr` and `std::weak_ptr` in a signal handler?

本文关键字:ptr std weak 是否 安全 信号处理 程序 shared      更新时间:2023-10-16

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

但是,如果我可以保证至少有一个共享引用将保持活动状态,那么复制构造和销毁其他共享或弱引用是安全的吗?还是我必须自己进行重新计数?

(是的,我知道信号处理程序通常不应该做太多。但是这次我有一个很好的理由。

c++标准对"普通旧函数"的定义如下:

一个POF("普通旧函数")是一个函数,它只使用来自[C/c++]公共子集的特性,它不直接或间接使用任何非POF的函数,除了它可以使用普通的无锁原子操作。

此外:

在c++程序中作为信号处理程序使用的除POF以外的任何函数的行为都是由实现定义的。

显然,c++类对象不是C/c++公共子集的一部分,因此在信号处理程序中使用它们会产生实现定义的行为。

现在,许多实现将允许您有限地使用c++特性。如果你的实现不允许内存分配或异常,那么这就是我们所知道的那些智能指针类型。

则所有weak_ptr构造函数都显式声明为noexcept。所以它们不能抛出异常。这也意味着不允许它们分配内存(因为分配内存失败会抛出异常)。是的,如果失败,它们可以分配内存和std::terminate,但对于实现来说,这样做是非常粗鲁的。

shared_ptr的copy&move构造函数与noexcept类似,因此同样适用。对于shared_ptr的混叠构造函数也是如此。

如果您绝对确定至少有一个shared_ptr仍然存在,那么明确地声明销毁shared_ptr没有副作用。这可能包括内存取消分配。

这些都是标准库为您提供的保证。