Вопрос по boost, thread-safety, mutex, c++ – повысить scoped_lock против простой блокировки / разблокировки

37

я собираюсь использоватьboost::mutex отboost/thread/mutex.hpp, Есть несколько способов заблокировать / разблокировать мьютекс: с,,scoped_lockunique_locklock_guardмьютексфункции-члены::lock() а также::unlock() и функции не членовlock() а также .unlock()

Я заметил, чтоboost::scoped_mutex является одним из самых популярных способов использования мьютекса. Почему это предпочтительно для функций-членов::lock() а также ?::unlock()

В частности, почему я должен использовать

{
  boost::scoped_lock lock(mutex)
  // ...
  // read/output sharing memory.
  // ...
}

скорее, чем

mutex.lock()
// ...
// read/output sharing memory.
// ...
mutex.unlock()

являетсяscoped_lock лучше просто из-за некоторой точки зрения стилевого кодирования или::lock()/::unlock() не "достаточно безопасный поток "?

Ваш Ответ

2   ответа
64

: lock () и :: unlock ()?

По той же причине, почемуRAII идиома стал популярным в целом (это только один из бесчисленных примеров): потому что вы можете быть уверены, что не оставить текущую область без разблокировки мьютекса.

Обратите внимание, что это не толькозабывая звонитьunlock(): исключение может произойти, когда ваш мьютекс заблокирован, и ваш вызовunlock() может никогда не быть достигнут, даже если у вас нетreturn Заявление между вашим звонкомlock() и ваш звонок.unlock()

m.lock() // m is a mutex
// ...
foo(); // If this throws, your mutex won't get unlocked
// ...
m.unlock()

В этом случае деструктор вашегоscoped_lock Guard будет вызываться при разматывании стека, убедившись, что соответствующий мьютексвсегда получает освобождение.

{
    boost::scoped_lock lock(m); // m is a mutex
    // ...
    foo(); // If this throws, your RAII wrapper will unlock the mutex
    // ...
}

Более того, во многих ситуациях это улучшит ваш код ».читаемость, в которой вы выигралинужно добавить вызовunlock() перед каждымreturn заявление.

спасибо за четкое объяснение. Max
@ Макс: рад, что помог Andy Prowl
2

std::lock_guard lock(mutex);

если неЯ не хочу использовать библиотеку Boost.

Похожие вопросы