Почему разблокировка unique_lock приводит к сбою моей программы? - PullRequest
0 голосов
/ 10 мая 2018

У меня странное поведение в отношении unique_lock. После создания я пытаюсь вызвать unlock, но моя программа вылетает. Я создал минимальный пример, который постоянно дает сбой функции разблокировки (для подтверждения использовал gdb).

#include <iostream>
#include <string>
#include <mutex>
#include <thread>
#include <chrono>

std::mutex myMutex;

void lockMe()
{
  std::unique_lock lock(myMutex);
  std::cout << "Thread\n";
}

int main()
{
  std::unique_lock lock(myMutex);
  auto c = std::thread(lockMe);
  std::this_thread::sleep_for(std::chrono::seconds(1));
  std::cout << "Main\n";
  myMutex.unlock();
  c.join();
  return 0;
}

Может кто-нибудь объяснить, почему это происходит?

1 Ответ

0 голосов
/ 10 мая 2018

Создав std::unique_lock lock(myMutex);, вы предоставляете блокировку / разблокировку мьютекса для объекта блокировки. если вы вручную разблокируете мьютекс, пока он все еще находится под контролем объекта lock, вы нарушите это ограничение, а деструктор lock выполнит попытку двойной разблокировки.

Это похоже на все оболочки RAII - после того, как вы предоставили управление ресурсами объекту RAII, вы не должны мешать ему, вручную удаляя ресурс.

Обратите внимание, что std::unique_lock предлагает метод разблокировки заблокированного мьютекса до окончания области действия, который не вызовет проблем:

lock.unlock();
...