C++ 在函数返回之前解锁互斥锁会增加并发性吗?

C++ 在函数返回之前解锁互斥锁会增加并发性吗?,c++,multithreading,c++11,locking,mutex,C++,Multithreading,C++11,Locking,Mutex,我们知道,调用析构函数时,std::unique_lock可能会释放互斥锁 考虑下面源代码中第8行的行为,lck.unlock(),我的问题是在函数返回之前解锁互斥是否会增加并发性 MessageWrapper ServerLeftCommunicator::receive() { unique_lock<mutex> lck(recvMsgQCvMtx_); recvMsgQCv_.wait(lck, [this] { return ! recvMsgQ_.empt

我们知道,调用析构函数时,std::unique_lock可能会释放互斥锁

考虑下面源代码中第8行的行为,
lck.unlock()
,我的问题是在函数返回之前解锁互斥是否会增加并发性

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;
}
MessageWrapper服务器LeftCommunicator::receive(){
唯一锁lck(recvMsgQCvMtx);
recvMsgQCv_u2;uu.wait(lck,[this]{
return!recvMsgQ.empty();
});
自动包装器=recvMsgQ_uq.front();
recvMsgQ_uq.pop();
lck.unlock();
返回包装器;
}

谢谢。

不。在您返回之前发生的第一件事是析构函数将调用
unlock
。假设返回值正在优化,并且
包装器
的类型实际上是
MessageWrapper
,则这是唯一将被销毁的局部变量

在这种情况下,显式调用
unlock
,希望从中获得一些好处将被视为不好的风格


也许,如果在函数返回之前发生其他非平凡的操作,您可以考虑这样做。但是,将特定于锁的内容放在作用域块中而不是显式解锁更合适。与任何并发优化一样,始终将锁的范围缩小到最小。

您没有显示足够的代码,我们无法估计各种操作的成本

然而,在我看来,您的代码可以从“命名返回值优化”中获益,因为对象
包装器
总是返回的。如果它被推断为
MessageWrapper
,那么编译器将直接在该目标返回值中构造
wrapper
。这意味着返回甚至不会有复制返回值的成本

在这种情况下,早期解锁几乎没有什么好处,因为返回的成本应该比复制对象低得多