在功能返回之前,可以解锁Mutex会增加并发
Could unlocking mutex before function return increase the concurrency?
众所周知,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
。这意味着返回甚至没有复制返回值的成本。
在这种情况下,早日解锁几乎没有好处,因为收益的成本比复制对象的成本要小得多。
相关文章:
- 我应该在锁定TBitmap画布后解锁它吗
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- "data race"(不是真的)在通知条件变量并解锁关联的互斥锁后
- 程序输入密码并解锁窗口7,8,10
- 在通知之前完成手动解锁
- STD :: Mutex如何在不同的线程中解锁
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 如何在C 中自动汇总日志消息并自动解锁互斥X
- 如果我们已经手动解锁了unique_lock,那么破坏时会解锁吗?
- 正在解锁手动未定义/不良设计的锁定guard
- 从C 运行代码后解锁绑定(在R中)的问题
- 在功能返回之前,可以解锁Mutex会增加并发
- 当互斥锁解锁时,它会notify_all或notify_one
- 如何确保在C ++中解锁储物柜?哪种解决方案更好
- 我应该如何在一个功能中锁定wxMutex,并在另一个功能中将其解锁
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 保持 std::mutex 锁定/解锁公开的基本原理
- C++ 在调用 std::unique_lock 等待之前解锁 std::mutex