c++ - 互斥体有范围吗?
问题描述
std::mutex
有范围吗?我知道在 JAVA 中我们可以使用{}
限制范围内的锁来尽快释放锁。如果我们可以在 c++ 中做同样的事情?
void func() {
// some code
{
std::lock_guard<std::mutex> lock(mutex_);
}
// some code
}
另外,互斥锁何时起作用?锁是一进入函数就起作用,还是一直执行到当前行被锁定?编译器对代码优化有影响吗?
void func() {
// some code
std::lock_guard<std::mutex> lock(mutex_); // mutex work here or as soon as it enters the function
// some code
}
解决方案
在帮助下,我终于找到了答案。阅读源代码,然后没有魔法。下面是 lock_guard 的源代码。
template<typename _Mutex>
class lock_guard
{
public:
typedef _Mutex mutex_type;
explicit lock_guard(mutex_type& __m) : _M_device(__m)
{ _M_device.lock(); }
lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _M_device(__m)
{ } // calling thread owns mutex
~lock_guard()
{ _M_device.unlock(); }
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
private:
mutex_type& _M_device;
};
“lock_guard”在创建时获取锁,在销毁时释放锁。它帮助我们不要忘记释放锁。
即使程序失败,也会调用析构函数来释放锁。
推荐阅读
- mysql - 查找连续字段,直到字段更改并将序列号添加到具有相同名称的行
- elixir - 升级 Elixir 项目时出现 Edeliver 错误:{:no_matching_relup, '0.1.0+35132c2', '0.1.0+ba8eb26'}
- typescript - 别名对象的属性名称 + 定义它的类型
- asp.net-mvc - 使用 jquery.ui datepicker 更新后,月份字段默认为 00
- java - Selenium WebDriver (java) 可以与浏览器的检查工具元素选择器交互吗?
- reactjs - 组件声明 te 被渲染;函数与变量的返回值
- c# - 我如何安全地处理变量?
- algorithm - 显示不相交哈密顿路径的 np 完备性
- ag-grid - ag-grid 如何设置浮动过滤器高度
- r - 模拟 for 循环并将值保存在向量中