std::mutex锁函数和std::lock_guard<std::mutex>的区别?
Difference between std::mutex lock function and std::lock_guard<std::mutex>?
基本上,标题是self-explanatory。
我按以下方式使用它:
- 代码在Objective-C++。
- Objective-C classes 对不同目的函数进行并发调用。
- 我在整个 class 中使用
std::mutex
到 lock
和 unlock
std::vector<T>
编辑选项,因为 C++ std 容器不是线程安全的。
std::lock_guard
仅用于两个目的:
- 销毁期间自动解锁互斥体(无需调用
.unlock()
)。
- 允许同时锁定多个互斥量以克服死锁问题。
对于最后一个用例,您将需要 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_guard
或unique_lock
而不是mutex::lock()
。参见 http://kayari.org/cxx/antipatterns.html#locking-mutex
基本上,标题是self-explanatory。 我按以下方式使用它:
- 代码在Objective-C++。
- Objective-C classes 对不同目的函数进行并发调用。
- 我在整个 class 中使用
std::mutex
到lock
和unlock
std::vector<T>
编辑选项,因为 C++ std 容器不是线程安全的。
std::lock_guard
仅用于两个目的:
- 销毁期间自动解锁互斥体(无需调用
.unlock()
)。 - 允许同时锁定多个互斥量以克服死锁问题。
对于最后一个用例,您将需要 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_guard
或unique_lock
而不是mutex::lock()
。参见 http://kayari.org/cxx/antipatterns.html#locking-mutex