默认析构函数在互斥锁上被阻止
Default destructor blocked on a mutex
我得到了如下实验代码:
class Foo {
public:
Foo() : mThread(&Foo::test, this) {
}
private:
std::thread mThread;
std::mutex mMutex;
std::condition_variable mCv;
void test() {
std::unique_lock<std::mutex> lock(mMutex);
mCv.wait(lock);
}
};
int main() {
Foo foo;
usleep(1000);
std::cout << "wake up" << std::endl;
}
而且代码会在Foo
的析构函数处阻塞,调试后发现线程在futex_wait
上被阻塞了,但是仔细检查了condition_variable
wait()
的文档,上面写着
在阻塞线程的那一刻,函数自动调用 lck.unlock((,允许其他锁定的线程继续。
那么为什么我的代码仍然在 mMutex 被阻止,因为mCv
已经unlocked
了?
附言我知道这种设计模式有问题,我只是好奇我是否缺少一些关于螺纹条件的知识。
程序表现出未定义的行为。在main
的右大括号处,foo
被销毁,它的成员变量也是如此,从mCv
开始。该标准说:
[thread.condition.condvar]/5
~condition_variable();
要求:
*this
上不应有线程阻塞。[ 注意:也就是说,所有线程都应已通知... —尾注 ]
您的程序违反了Require子句,因为另一个线程中的test
等待mCv
并且尚未收到通知。
相关文章:
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 当指针在 cpp 17 中失去引用时,是否会调用非默认析构函数?
- 默认析构函数在互斥锁上被阻止
- 如何使默认析构函数非内联?
- 非默认析构函数会导致不完整的类型错误
- 显式默认析构函数禁用类中的默认移动构造函数
- 为什么要在释放分配给该对象的内存之前调用该对象的默认析构函数?
- C++11 中默认纯虚拟析构函数的正确放置
- 具有虚拟析构函数的基类子类中的默认析构函数
- 使用默认构造函数的父类;子类的析构函数意外调用
- 默认移动分配调用析构函数,复制分配不
- 从默认构造函数调用成员的析构函数
- 虚拟析构函数的默认覆盖
- C++:析构函数内部如何工作以及谁调用默认析构函数
- 默认关键字虚拟析构函数
- 默认析构函数nothrow
- 默认的纯虚拟析构函数
- 在未使用的类的默认析构函数处崩溃
- 重写默认构造函数/析构函数而不实现它们
- C++11 中默认虚拟析构函数的异常规范是什么?