将std :: lock_guard固定在破坏者中是安全的吗?
Is it safe to hold a std::lock_guard in the destructor?
我正在尝试确定以下代码是否安全,或者它是否是UB,并且在这种情况下仅恰好工作得很好(在此处运行(:
#include <iostream>
#include <mutex>
struct Foo
{
std::mutex mutex;
~Foo()
{
std::lock_guard<std::mutex> lock(mutex);
}
};
int main()
{
{
Foo foo;
}
std::cout << "everything seems to work fine...?" << std::endl;
}
具体来说,我们是否保证在成员变量为?
我从cppreference.com找到了以下内容,但似乎并没有完全回答我的问题:
破坏序列
对于用户定义或隐式定义的驱动器,在执行破坏者的主体之后,编译器将destructor拨打destructors for class的所有非静态非变化成员,然后以声明的相反顺序调用,然后调用以相反的施工顺序(反过来称呼其成员及其基础类别等(的所有直接非虚拟基类的破坏者(,然后,如果此对象是最衍生的类别,则称为destructors the Destructors在所有虚拟基础中。
根据[class.dtor]/9,
的标准执行破坏者的身体并破坏了身体内部分配的任何自动对象,
X
类的驱动器调用X
直接非变化的非静态数据成员的破坏者,destructor 对于X
的非虚拟直接基类,如果X
是最派生的类的类型(15.6.2(,则其破坏者 调用X
的虚拟基类的破坏者。...
这以肯定的方式回答您的问题。
在破坏任何成员之前,驱动器的身体是执行的。从这个意义上说这很安全。
但是,在提出问题之前,是否有任何明智的用例是否有任何明智的用例,必须询问击路仪(以及构造函数(。
只有一个线程可以构建或破坏对象。必须通过对象的的穆特克斯来保证这一点,例如在工厂的建设或共享指针中的破坏时。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 将std :: lock_guard固定在破坏者中是安全的吗?