исключение выдается из std :: scoped_lock - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь заблокировать мьютекс из другого потока, очистить вектор, используя 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 Ответ

1 голос
/ 14 мая 2019

Вам необходимо сохранить блокировку по объему. Как таковая, блокировка получается во временную переменную, которая немедленно уничтожается, освобождая блокировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...