如何在 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_};
}
使用临时锁几乎没用,因为锁会立即释放。正确的用法是声明一个具有自动生命周期的局部变量。
在下面的代码中,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_};
}
使用临时锁几乎没用,因为锁会立即释放。正确的用法是声明一个具有自动生命周期的局部变量。