"互斥"和"锁定"有什么区别?

260*_*607 22 c++ multithreading boost mutex boost-thread

我对锁和互斥锁之间的区别感到非常困惑.在Boost文档中,它说,

锁定类型

  • 类模板lock_guard
  • 类模板unique_lock
  • 类模板shared_lock
  • 类模板upgrade_lock
  • 类模板upgrade_to_unique_lock
  • 特定于互斥锁的类scoped_try_lock

互斥体类型

  • 类互斥
  • Typedef try_mutex
  • 类timed_mutex
  • 类recursive_mutex
  • Typedef recursive_try_mutex
  • 类recursive_timed_mutex
  • 类shared_mutex

在另一篇文章中,我看到这样的函数,

boost::shared_mutex _access;
void reader()
{
  boost::shared_lock< boost::shared_mutex > lock(_access);
  // do work here, without anyone having exclusive access
}    
void conditional_writer()
{
  boost::upgrade_lock< boost::shared_mutex > lock(_access);
  // do work here, without anyone having exclusive access

  if (something) {
    boost::upgrade_to_unique_lock< boost::shared_mutex > uniqueLock(lock);
    // do work here, but now you have exclusive access
  }
  // do more work here, without anyone having exclusive access
}
Run Code Online (Sandbox Code Playgroud)

更新了问题

  1. 任何人都可以在"互斥"和"锁定"之间提供一些澄清吗?
  2. 是否有必要为shared_mutex创建shared_lock?如果我为shared_mutex创建unique_lock会发生什么?
  3. 或者,如果我为互斥锁创建一个shared_lock,是否意味着多个线程之间不能共享互斥锁?

Ant*_*ams 39

互斥是同步对象.您在代码段的开头获取互斥锁,并在最后释放它,以确保没有其他线程同时访问相同的数据.互斥锁通常具有与其保护的数据相同的生命周期,并且多个线程可以访问一个互斥锁.

锁定对象是一个封装该锁的对象.构造对象时,它获取互斥锁上的锁.当它被破坏时,锁被释放.您通常会为每次访问共享数据创建一个新的锁定对象.

  • +1:锁的生命周期是对一段代码的独占访问的持续时间; 互斥体的生命周期通常是存在可以锁定的代码段. (6认同)

Jam*_*nze 13

互斥锁是可以锁定的对象.锁是保持锁的对象.要创建锁,您需要将其传递给互斥锁.