默认析构函数在互斥锁上被阻止

Default destructor blocked on a mutex

本文关键字:析构函数 默认      更新时间:2023-10-16

我得到了如下实验代码:

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_variablewait()的文档,上面写着

在阻塞线程的那一刻,函数自动调用 lck.unlock((,允许其他锁定的线程继续。

那么为什么我的代码仍然在 mMutex 被阻止,因为mCv已经unlocked了?

附言我知道这种设计模式有问题,我只是好奇我是否缺少一些关于螺纹条件的知识。

程序表现出未定义的行为。在main的右大括号处,foo被销毁,它的成员变量也是如此,从mCv开始。该标准说:

[thread.condition.condvar]/5

~condition_variable();

要求*this上不应有线程阻塞。[ 注意:也就是说,所有线程都应已通知... —尾注 ]

您的程序违反了Require子句,因为另一个线程中的test等待mCv并且尚未收到通知。