У меня есть функция IO_Operation
, которая инициирует поток ввода-вывода, чтобы сделать что-то асинхронно.Но я разрешаю запускать только один поток ввода-вывода за раз, поэтому для этого я использую уникальную блокировку.
Вот мой код:
void MyClass::IO_Operation(...) {
std::thread(&MyClass::IO_Worker, this, ...).detach();
}
void MyClass::IO_Worker(...) {
boost::unique_lock<boost::shared_mutex> io_thread_lock(this->iothread_mutex_, boost::defer_lock_t());
bool own_lock = io_thread_lock.try_lock();
if (!own_lock) return;
...
...
...
}
код выдаст эту ошибку:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error> >'
what(): boost unique_lock doesn't own the mutex: Operation not permitted
Ошибка произошла при выходе из функции, в деструкторе boost::unique_lock
я посмотрел исходный код для boost::unique_lock
на https://www.boost.org/doc/libs/1_58_0/boost/thread/lock_types.hpp
, его деструктор -
~unique_lock()
{
if (owns_lock())
{
m->unlock();
}
}
void unlock()
{
if (m == 0)
{
boost::throw_exception(
boost::lock_error(static_cast<int>(system::errc::operation_not_permitted), "boost unique_lock has no mutex"));
}
if (!owns_lock())
{
boost::throw_exception(
boost::lock_error(static_cast<int>(system::errc::operation_not_permitted), "boost unique_lock doesn't own the mutex"));
}
m->unlock();
is_locked = false;
}
кажется, что статус этого unique_lock
был поврежден, owns_lock()
возвращает true на первом месте, а затем возвращает false ..... Этот unique_lock является переменной блокировки, поэтому невозможно, чтобы другие потокиизменить его состояние.