shared_mutex.lock 和 shared_mutex.lock_shared 之间的性能差异?

performance differences between shared_mutex.lock and shared_mutex.lock_shared?

提问人:Xin_Wang 提问时间:5/2/2023 最后编辑:Xin_Wang 更新时间:5/2/2023 访问量:46

问:

场景是:我有二换二的共享变量,为了防止死锁,如果线程A得到但不能得到,线程B得到但不能得到,在这种情况下,线程A应该放弃还是应该放弃线程B?这两种选择之间有什么性能差异吗?shared_mutexabmutex_amutex_bshared_mutex_bshared_mutex_amutex_ashared_mutex_b


std::shared_mutex mutex_a, mutex_b;
int a, b;

void foo(){
  mutex_a.lock();
  if(mutex_b.try_lock()){
    do sth();
    mutex_a.unlock();
    mutex_b.unlock();
  }else{
    mutex_a.unlock();        // choice 1
  }
}

void bar(){
  mutex_b.lock_shared();
  if(mutex_a.try_lock_shared()){
    do sth();
    mutex_b.unlock_shared();
    mutex_a.unlock_shared();
  }else{
    mutex_b.unlock_shared();   //choice 2
  }
}

我知道以相同的顺序获取两个锁可以防止死锁,但这不是重点!

C++ 性能 ReadWriteLock

评论

0赞 Richard Critten 5/2/2023
代码的两部分都需要回避路径,因为无法预测哪个锁先被锁定。
1赞 user207421 5/2/2023
这个问题毫无意义。两个线程都不知道它是 A 还是 B。两个线程都应放弃其锁。“我知道以相同的顺序获取两个锁可以防止死锁,但这不是重点!”:这正是重点,没有其他要点。
0赞 Bananenkönig 5/2/2023
正如@RichardCritten所说,这两个部分都需要回避路径。试想一下,第三个函数具有与所需结构相同的功能。如果你使用你的“选择2”,你有机会再次陷入僵局。如果它具有相同的结构,并且您使用“选择 1”,则行为相同。void foobar()void foo()void bar()
0赞 Xin_Wang 5/2/2023
也许代码具有误导性,我的意图只是想知道 vs ,哪个更有效率?lock/unlocklock_shared/unlock_shared
0赞 Xin_Wang 5/2/2023
根据效率差异,我想采取不同的措施。例如,如果失败,我将立即,但如果失败,我将重试一次。try_lock_sharedunlock_sharedtry_lock

答: 暂无答案