Ошибка boost :: unique_lock, статус поврежден - PullRequest
0 голосов
/ 26 января 2019

У меня есть функция 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 является переменной блокировки, поэтому невозможно, чтобы другие потокиизменить его состояние.

...