如何在 class 成员互斥锁上使用 std::lock_guard

How to use std::lock_guard on a class member 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 而不是任何类型的锁,这使它成为一个非常容易混淆的名称。你应该给它起一个更能反映它是什么的名字。喜欢 mutex_.

你需要实际创建一个变量,例如

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

如果您正确声明 lock_guard,它们都有效:

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

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

使用临时锁几乎没用,因为锁会立即释放。正确的用法是声明一个具有自动生命周期的局部变量。