如何获取指向关联互斥锁的指针



我正在使用互斥锁,在构建代码时,它抛出一个错误:'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;
};

注意mutexunique_lock成员变量在任何时候都不能被复制或移动。

最新更新