在功能返回之前,可以解锁Mutex会增加并发

Could unlocking mutex before function return increase the concurrency?

本文关键字:Mutex 解锁 增加 并发 返回 功能      更新时间:2023-10-16

众所周知,std :: simolor_lock可能会释放静音器时释放。

考虑下面源的第8行的行为lck.unlock(),我的问题是在功能返回之前解锁Mutex是否会增加并发?

MessageWrapper ServerLeftCommunicator::receive() {
  unique_lock<mutex> lck(recvMsgQCvMtx_);
  recvMsgQCv_.wait(lck, [this] {
    return ! recvMsgQ_.empty();
  });
  auto wrapper = recvMsgQ_.front();
  recvMsgQ_.pop();
  lck.unlock();
  return wrapper;
}

谢谢。

no。返回之前将发生的第一件事是破坏者将调用unlock。那就是唯一的本地变量,假设正在发生返回值优化,并且wrapper的类型实际上是MessageWrapper

明确调用unlock,希望您能获得一些好处在这种情况下被认为是不好的样式。

也许,如果在功能返回之前发生其他非平凡操作,则可以考虑这样做。但是将特定于锁定的东西放入示波器块而不明确解锁将更合适。与任何并发优化一样,请始终将锁的范围降低到最低。

您没有真正显示足够的代码,我们可以估计各种操作的昂贵。

但是,在我看来,您的代码可以从"命名返回值优化"中受益,因为对象wrapper始终返回。如果将其推导为MessageWrapper,那么编译器将要做的就是直接在该目标返回值中构造wrapper。这意味着返回甚至没有复制返回值的成本。

在这种情况下,早日解锁几乎没有好处,因为收益的成本比复制对象的成本要小得多。