gpt4 book ai didi

c++ - 默认析构函数在互斥体上被阻止

转载 作者:行者123 更新时间:2023-12-02 10:08:01 25 4
gpt4 key购买 nike

我得到了下面的代码进行实验:

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上被阻塞,但是仔细检查 wait()condition_variable文档,它说

At the moment of blocking the thread, the function automatically calls lck.unlock(), allowing other locked threads to continue.



那么,为什么我的代码由于 mCv具有 unlocked而仍然在mMutex处被阻止了?

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

最佳答案

您的程序表现出未定义的行为。从main开始,在foo的结尾处,mCv及其成员变量也被破坏。该标准说:

[thread.condition.condvar]/5

~condition_variable();

Requires: There shall be no thread blocked on *this. [ Note: That is, all threads shall have been notified... —end note ]



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

关于c++ - 默认析构函数在互斥体上被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59206658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com