c++ - 如何在类成员互斥锁上使用 std::lock_guard

标签 c++ c++11 mutex

在下面的代码中,bad 方法编译失败,但是 good 方法没有。为什么提供对 this 的显式引用在这里有所不同?

#include <mutex>

class Foo
{
 private:
  std::mutex lock_;

 public:
  Foo() = default;
  ~Foo() = default;

  void bad();
  void good();
};

void Foo::bad()
{
  std::lock_guard<std::mutex>(lock_);
}

void Foo::good()
{
  std::lock_guard<std::mutex>(this->lock_);
}

int main()
{
  return 0;
}

编译错误:

test.cpp: In member function ‘void Foo::bad()’:
test.cpp:18:36: error: no matching function for call to ‘std::lock_guard<std::mutex>::lock_guard()’
   std::lock_guard<std::mutex>(lock_);

你可以玩ideone如果你愿意的话。

最佳答案

这是最令人烦恼的解析实例。这里的括号并不像您认为的那样。这:

std::lock_guard<std::mutex>(lock_);

相当于:

std::lock_guard<std::mutex> lock_;

这应该清楚说明您尝试执行的操作无法编译的原因,以及您遇到编译错误的原因。您需要做的是为 lock_guard 提供一个名称:

std::lock_guard<std::mutex> _(lock_);

好的版本是有效的,因为 this-> 资格阻止名称被视为标识符。


注意:lock_ 是一个 std::mutex 而不是任何一种锁,这使它成为一个非常容易混淆的名字。你应该给它起一个更能反射(reflect)它是什么的名字。像 mutex_

关于c++ - 如何在类成员互斥锁上使用 std::lock_guard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32850504/

相关文章:

c++ - 适用于 Windows 'rm' 的 Git-Bash 如何工作?

c++ - 通过构造函数初始化 unique_ptr

c++ - 错误 : base class 'A1' has private copy constructor

c - pthread 互斥体中的意外行为

c++ - 同步 QThreads 时出现问题

c++ - 如何修复没有匹配函数 ifstream 错误?

c++ - 如何将枚举类型的数据保存到文件?

c++ - 将类对象实例作为参数从 main() 传递给另一个类对象实例

c++ - 互斥锁出错了?

multithreading - 读写互斥锁/锁如何工作?