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_};
}