Mutex.lock vs unique_lock

Когда я должен предпочесть первый кусок кода ко второму, и имеют ли они фундаментальные различия

std::mutex mtx;
mtx.lock();
... //protected stuff
mtx.unlock();
... //non-protected stuff
mtx.lock();
... //etc

и

std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
... //protected stuff
lck.unlock();
... //non-protected stuff
lck.lock();
... //etc

Я понимаю, что lock_guard - это, по сути, уникальный_lock без функций блокировки и разблокировки, но мне трудно дифференцировать мьютекс и блокировку с помощью мьютекса.

Ответы

Ответ 1

Да, std:: unique_lock вызывает разблокировку мьютекса в деструкторе. Преимущество этого в том, что в случае исключения какого-либо исключения вы уверены, что мьютекс будет разблокирован при выходе из области, где определен std:: unique_lock.

Ответ 2

Подумайте об этом так:

// define a mutex
std::mutex mtx;

... намного позже...

void something_safe()
{

  // code in these braces is a critical section
  {
    auto lock = std::unique_lock<std::mutex>(mtx); // equivalent to mtx.lock();
    ... //protected stuff
  }  // <---- however you leave this brace, equivalent to mtx.unlock();

  ... //non-protected stuff
}