Multithreading std::mutex lock函数和std::lock\u guard的区别<;std::mutex>;?

Multithreading std::mutex lock函数和std::lock\u guard的区别<;std::mutex>;?,multithreading,c++11,mutex,objective-c++,Multithreading,C++11,Mutex,Objective C++,基本上,标题是不言自明的。 我使用它的方式如下: 代码是用Objective-C++编写的 Objective-C类对不同的目标函数进行并发调用 使用 STD:MutX < /C> >代码>锁定< /COD>和解锁 STD::向量跨整个类的编辑选项,因为C++ STD容器不是线程安全的。 std::lock_guard仅用于两个目的: 销毁期间自动解锁互斥锁(无需调用.unlock()) 允许同时锁定多个互斥锁以克服死锁问题 对于最后一个用例,您需要std::采用锁定标志: std::loc

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

  • 代码是用Objective-C++编写的
  • Objective-C类对不同的目标函数进行并发调用
  • 使用<代码> STD:MutX < /C> >代码>锁定< /COD>和<代码>解锁 <代码> STD::向量跨整个类的编辑选项,因为C++ STD容器不是线程安全的。

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

  • 销毁期间自动解锁互斥锁(无需调用
    .unlock()
  • 允许同时锁定多个互斥锁以克服死锁问题
  • 对于最后一个用例,您需要
    std::采用锁定
    标志:

    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(互斥锁1,互斥锁2);
    std::lock\u guard lockPurposeOne(互斥锁,std::采用锁);
    std::lock\u guard lockpurpose2(互斥锁,std::采用锁);
    
    另一方面,每次需要锁定互斥锁时,都需要为guard分配另一个类实例,因为
    std::lock\u guard
    没有成员函数。如果您需要具有解锁功能的防护装置,请查看
    std::unique_lock
    类。您也可以考虑使用<代码> STD::SysDyLoCux<代码>并行读取向量。

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


    对于Objy-C应用程序,使用GCD更方便,同时为所有C++容器分配一对队列,并在需要时放置信号量。看看这个很棒的

    使用
    lock\u guard
    在互斥锁超出范围时自动再次解锁。这使得在返回或抛出异常时不可能忘记解锁它。您应该始终更喜欢使用
    lock\u-guard
    unique\u-lock
    而不是使用
    mutex::lock()
    。看


    lock\u guard
    是or类型的一个示例。

    什么是“每次需要锁定互斥锁时,您都需要为该保护分配另一个类实例”?你让它听起来像是
    lock\u-guard
    坏了。如果你需要它,它还不错。但是如果你以这种方式构建应用程序,那么死锁就不可能发生——你不需要它。