从std :: scoped_lock抛出的异常

时间:2019-05-14 10:37:15

标签: c++ multithreading concurrency c++17

我正在尝试使用scoped_lock锁定另一个线程的互斥锁,以清除向量,希望代码会等到另一个线程释放它。

但是发生的是试图获取锁的函数抛出异常,表明资源正忙。

//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线程库,所以我不确定自己在做什么错。我使用了错误的线程构造吗?如果是这样,我应该使用什么来确保呼叫等待直到互斥体被释放?

1 个答案:

答案 0 :(得分:1)

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