C++ 如何在类成员互斥体上使用std::lock\u-guard

C++ 如何在类成员互斥体上使用std::lock\u-guard,c++,c++11,mutex,C++,C++11,Mutex,在下面的代码中,bad方法编译失败,而good方法编译失败。为什么明确引用这个会在这里产生影响 #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>

在下面的代码中,
bad
方法编译失败,而
good
方法编译失败。为什么明确引用
这个
会在这里产生影响

#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;
}
#包括
福班
{
私人:
std::互斥锁;
公众:
Foo()=默认值;
~Foo()=默认值;
无效坏();
无效货物();
};
void Foo::bad()
{
标准:锁紧防护装置(锁紧);
}
void Foo::good()
{
std::锁紧装置(此->锁紧装置);
}
int main()
{
返回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_);
test.cpp:在成员函数“void Foo::bad()”中:
test.cpp:18:36:错误:调用“std::lock\u guard::lock\u guard()”时没有匹配的函数
标准:锁紧防护装置(锁紧);

如果您愿意,您可以使用。

这是一个最麻烦的解析实例。这里的括号不是你想象的那样。这:

std::lock_guard<std::mutex>(lock_);
好的版本之所以有效,是因为
此->
限定阻止名称被视为标识符



注意:
lock\uu
是一个
std::mutex
而不是任何类型的锁,这使得它的名称非常混乱。你应该给它起个更能反映它的名字。例如,像
互斥锁

一样,您需要实际创建一个变量

std::lock_guard<std::mutex> lg(lock_);
std::锁紧保护lg(锁紧);

如果您正确声明了锁紧装置,它们都可以工作:

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

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

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

引入此->时,为什么要编译它?@Borgeader,因为它不能再被解析为标识符-因此不能含糊地将其视为声明。只是一个旁注-编译时的第二个变量,不会真正在任何时间锁定任何东西-锁在这一行之后立即过期,而不是在函数结束时过期,这可能是需要的。
std::lock_guard<std::mutex> lg(lock_);
void Foo::bad()
{
  std::lock_guard<std::mutex> x{lock_};
}

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