std::mutex锁函数和std::lock_guard<std::mutex>的区别?

Difference between std::mutex lock function and std::lock_guard<std::mutex>?

基本上,标题是self-explanatory。 我按以下方式使用它:

std::lock_guard仅用于两个目的:

  1. 销毁期间自动解锁互斥体(无需调用 .unlock())。
  2. 允许同时锁定多个互斥量以克服死锁问题。

对于最后一个用例,您将需要 std::adopt_lock 标志:

std::lock(mutex_one, mutex_two);
std::lock_guard<std::mutex> lockPurposeOne(mutex_one, std::adopt_lock);
std::lock_guard<std::mutex> lockPurposeTwo(mutex_two, std::adopt_lock);

另一方面,每次需要锁定互斥量时,您都需要为守卫分配另一个 class 实例,因为 std::lock_guard 没有成员函数。如果您需要具有解锁功能的守卫,请查看 std::unique_lock class。您也可以考虑使用 std::shared_lock 并行读取向量。

您可能会注意到,std::shared_lock class 在头文件中被注释掉,并且只能通过 C++17 访问。根据头文件,您可以使用 std::shared_timed_mutex,但是当您尝试构建应用程序时,它将失败,因为 Apple 已经更新了头文件,而不是 libc++ 本身。

因此对于 Objective-C 应用程序,使用 GCD 可能更方便,同时为所有 C++ 容器分配几个队列,并在需要的地方放置信号量。看看这个优秀的comparison

使用 lock_guard 会在超出范围时自动再次解锁互斥体。这使得不可能在返回时或抛出异常时忘记解锁它。你应该总是更喜欢使用lock_guardunique_lock而不是mutex::lock()。参见 http://kayari.org/cxx/antipatterns.html#locking-mutex

lock_guardRAII or SBRM 类型的示例。