我正在使用互斥锁,在构建代码时,它抛出一个错误:'error: use of deleted function ‘std::mutex::mutex(const std::mutex&)'
我明白为什么我得到这个错误,参考这个答案:试图在使用互斥时引用一个已删除的函数。现在,我不知道如何获取存储在被复制实例中的互斥锁。任何一般的例子都会有所帮助。谢谢!
编辑
file.h
class A
{
...
std::mutex taskMutex;
bool isExecuting;
...
}
file.cpp
int function1
{
std::unique_lock<std::mutex> lock(taskMutex);
...
( lambda func executing )
isExecuting = true
...
isExecuting = false
}
int function2
{
while(isExecuting);
std::unique_lock<std::mutex> lock(taskMutex);
}
由于每个实例都应该是可锁定的,因此在从它复制时需要锁定对象——如果它具有非默认的可构造成员变量,这也可能导致问题。
一个想法是添加一个unique_lock
成员,可以在复制/移动时锁定正在复制或移动的对象。
这是一个大纲:
class Foo {
public:
Foo() = default;
Foo(const Foo& rhs) : // copy constructor
ul(rhs.mtx), // lock the object being copied from
member(rhs.member) // copy its members in the member initializer list
{
ul.unlock(); // unlock
}
Foo(Foo&& rhs) noexcept : // move constructor
ul(rhs.mtx), // lock the object being moved from
member(std::move(rhs.member)) // move its members in the member init-list
{
ul.unlock(); // unlock
}
Foo& operator=(const Foo& rhs) { // copy assignment
std::scoped_lock lock(mtx, rhs.mtx); // lock both objects involved
member = rhs.member; // ... and copy
return *this;
}
Foo& operator=(Foo&& rhs) noexcept { // move assignment
std::scoped_lock lock(mtx, rhs.mtx); // lock both objects involved
member = std::move(rhs.member); // ... and move
return *this;
}
private:
std::unique_lock<std::mutex> ul; // used to lock rhs while copy/move constructing
mutable std::mutex mtx;
std::string member;
};
注意mutex
和unique_lock
成员变量在任何时候都不能被复制或移动。