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

时间:2016-07-12 23:28:12

标签: multithreading c++11 mutex objective-c++

基本上,标题是不言自明的。 我按照以下方式使用它:

  • 代码在Objective-C ++中。
  • Objective-C类对不同目的函数进行并发调用。
  • 我在整个班级中使用TypeNameHandlingstd::mutexlock unlock编辑选项,因为C ++标准容器不是线程安全的。

2 个答案:

答案 0 :(得分:10)

使用protected void processAdmission(String confirmationCode, String terminalCode) throws AdmissionException { //Check availability in the database boolean isAvailable = checkDatabaseAvailability(confirmationCode, terminalCode); if (!isAvailable) { throw new AdmissionException(); } saveInDatabase(confirmationCode, terminalCode); } 会在超出范围时再次自动解锁互斥锁。这使得在返回时或抛出异常时忘记解锁它是不可能的。您应始终更喜欢使用lock_guardlock_guard而不是unique_lock。见http://kayari.org/cxx/antipatterns.html#locking-mutex

mutex::lock()RAIISBRM类型的示例。

答案 1 :(得分:1)

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

  1. 在销毁期间自动执行互斥锁解锁(无需拨打.unlock())。
  2. 允许同时锁定多个互斥锁以克服死锁问题。
  3. 对于最后一个用例,您需要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);
    

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

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

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