首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++ std::lock_guard范围

c++ std::lock_guard范围
EN

Stack Overflow用户
提问于 2020-09-25 19:13:46
回答 1查看 199关注 0票数 1

让我们假设我有一个函数,它获取一个锁并执行通过参数传递的函数:

代码语言:javascript
运行
复制
template <typename T>
T acquireLock(std::mutex& _lock, const std::function<T()>& execution) {

  try {
    std::lock_guard<std::mutex> mutex (_lock);

    return execution();

  } catch (std::logic_error& error) {

    std::cerr << "[exception caught]\n\t" << error.what() << std::endl;

  }

  return false;
}

另外,我还有一个类需要获取它的一些方法的锁。

代码语言:javascript
运行
复制
class MyThreadSafeClass {

 public:

  bool Init();
  bool StopApi();
  unsigned int GetValue() {

      auto ret = acquireLock<unsigned int>(_lock, [this]() -> unsigned int {

        // does some work that's not thread-safe...
        return value;

      });

      return ret;
  }

 private:

  bool _ready = false;
  std::mutex _lock;

};

我的疑问是,每当我调用GetValue()时,看看我的acquireLock()方法,execution()调用是否也会受到锁作用域的影响?

代码语言:javascript
运行
复制
auto myClass = new MyThreadSafeClass();
myClass->GetValue();

看看,更具体地说:

当创建一个lock_guard对象时,它试图获得它所给出的互斥对象的所有权。当控件离开创建lock_guard对象的作用域时,将销毁lock_guard并释放互斥对象。

我仍然不清楚execution()代码中发生的事情是否仍然受到锁作用域的影响。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-25 19:53:01

根据[stmt.return]/p3

  1. 调用结果的复制初始化是在返回语句的操作数建立的完整表达式结束时销毁临时程序之前进行的,返回语句的操作数在销毁包含返回语句的块的局部变量(stmt.jump)之前对其进行排序。

所以我们得到:

  1. 互斥锁住了
  2. 在保存锁时调用execution()
  3. 锁被释放了
  4. 计算值将返回给调用方(或者输入catch子句)

换句话说,是的,它将按预期工作。

不相关的注意:std::function不是很有效。可调用类型上的模板应该工作得更好:

代码语言:javascript
运行
复制
template<typename F>
auto doLocked(std::mutex& _lock, F const& f) -> decltype(f()) {
    std::lock_guard<std::mutex> lock(_lock);
    return f();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64070131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档