gpt4 book ai didi

c++ - 从 std::scoped_lock 抛出的异常

转载 作者:行者123 更新时间:2023-11-30 04:47:43 33 4
gpt4 key购买 nike

我正在尝试使用 scoped_lock 从另一个线程锁定一个互斥体,以清除一个 vector ,期望代码将等待直到另一个线程释放它。

但实际情况是,尝试获取锁的函数抛出异常,表明资源正忙。

//Called from thread 1
Foo::DoStuff()
{
std::scoped_lock<std::mutex>(m_lock);
for (auto thing: stuff) //should be non trivial in size
{
thing->bar();
}
}

//called from thread 0
Foo::ClearStuff()
{
try
{
std::scoped_lock<std::mutex>(m_lock); //throws
stuff.clear();
}
catch (const std::exception& e)
{
std::cout << e.what() << std::endl;
// device or resource busy: device or resource busy
}
}

我的线程知识基于 SDL2 线程库,所以我不确定我做错了什么。我使用了错误的线程构造吗?如果是这样,我应该使用什么来确保调用等到互斥量被释放?

最佳答案

您需要存储作用域锁。事实上,锁被获取到一个临时变量中,该变量立即被销毁,释放锁。

std::scoped_lock<std::mutex> lock(m_lock);

旁注:我将其称为 m_stuff_mtx 而不是 m_lock,因为它控制对 stuff 的访问,是一个互斥锁,并且有游戏中的其他东西称为锁。

关于c++ - 从 std::scoped_lock 抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56128501/

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