C ++将互斥锁传递给构造函数中的成员变量
C++ passing a mutex to a member variable in the constructor
我在向 class 传递互斥量时遇到问题。我有一个名为 Test
的 class 和一个名为 m_Mutex
的成员变量。在构造函数中我想将参数 mutex 传递给 m_Mutex
.
我的class:
#include <mutex>
class Test
{
public:
Test(mutex &mtx) :
m_Mutex(mtx)
{
}
private:
mutex m_Mutex;
};
我的主要:
int main()
{
mutex mutex1;
Test t(mutex1);
return 0;
}
错误:
function "std::mutex::mutex(const std::mutex &)" (declared at line 88
of "c:\Program Files (x86)\Microsoft Visual
Studio17\Professional\VC\Tools\MSVC.11.25503\include\mutex")
cannot be referenced -- it is a deleted function
为什么我会收到此错误?如何解决才能传递互斥锁?
In the constructor I want to transfer the parameter mutex to m_Mutex
很遗憾,你不能。 std::mutex
不可复制也不可移动。如果您想在其他地方声明互斥锁,您可以做的一件事是存储对互斥锁的引用,例如
class Test
{
public:
Test(mutex &mtx) :
m_Mutex(mtx)
{
}
private:
mutex& m_Mutex;
};
简而言之:你不能。互斥体既不可复制也不可移动。而且他们没有充分的理由。然而,如果你想实现这一点,你可以使用 unique_ptr:
传递它
class A {
unique_ptr<mutex> mutexPtr;
A(unique_ptr<mutex> ptr) : mutexPtr(std::move(ptr)) { }
};
A a{std::make_unique<mutex>()};
注意,如果你想在不同的对象之间共享互斥量,你应该使用shared_ptr或weak_ptr。
#include <mutex>
class Test
{
public:
Test(std::mutex &mtx) :
m_Mutex(mtx)
{
}
private:
std::mutex &m_Mutex; // note the "&"
};
int main()
{
std::mutex mutex1;
Test t(mutex1);
return 0;
}
做个参考就可以了
对于 class 的所有实例,您的互斥量必须相同,否则您在 class 的一个实例中执行的锁定不会对另一个实例有效.
#include <mutex>
#include <iostream>
using namespace std;
class Test
{
public:
Test(mutex &mtx) :
m_Mutex(mtx)
{
m_Mutex.lock();
i++;
cout << "Test " <<i<<endl;
m_Mutex.unlock();
}
private:
mutex& m_Mutex;
static int i;
};
int Test::i =0;
int main()
{
mutex mutex1;
Test t1(mutex1);
Test t2(mutex1);
return 0;
}
只需将互斥锁保留在您的 class 中(可能作为静态成员),如果您需要允许其他 classes 使用它,请提供访问权限:
class Test
{
public:
Test() {}
std::mutex &mux() { return m_Mutex; }
private:
mutex m_Mutex;
};
甚至这样:
class Test {
public:
using lock_t = std::scoped_lock<std::mutex>;
Test() {}
lock_t lock() { return lock_t( m_Mutex ); }
private:
mutex m_Mutex;
};
用法:
Test t;
{
auto lock = t.lock();
// object t is locked till end of the block
}
我在向 class 传递互斥量时遇到问题。我有一个名为 Test
的 class 和一个名为 m_Mutex
的成员变量。在构造函数中我想将参数 mutex 传递给 m_Mutex
.
我的class:
#include <mutex>
class Test
{
public:
Test(mutex &mtx) :
m_Mutex(mtx)
{
}
private:
mutex m_Mutex;
};
我的主要:
int main()
{
mutex mutex1;
Test t(mutex1);
return 0;
}
错误:
function "std::mutex::mutex(const std::mutex &)" (declared at line 88 of "c:\Program Files (x86)\Microsoft Visual Studio17\Professional\VC\Tools\MSVC.11.25503\include\mutex") cannot be referenced -- it is a deleted function
为什么我会收到此错误?如何解决才能传递互斥锁?
In the constructor I want to transfer the parameter mutex to
m_Mutex
很遗憾,你不能。 std::mutex
不可复制也不可移动。如果您想在其他地方声明互斥锁,您可以做的一件事是存储对互斥锁的引用,例如
class Test
{
public:
Test(mutex &mtx) :
m_Mutex(mtx)
{
}
private:
mutex& m_Mutex;
};
简而言之:你不能。互斥体既不可复制也不可移动。而且他们没有充分的理由。然而,如果你想实现这一点,你可以使用 unique_ptr:
传递它class A {
unique_ptr<mutex> mutexPtr;
A(unique_ptr<mutex> ptr) : mutexPtr(std::move(ptr)) { }
};
A a{std::make_unique<mutex>()};
注意,如果你想在不同的对象之间共享互斥量,你应该使用shared_ptr或weak_ptr。
#include <mutex>
class Test
{
public:
Test(std::mutex &mtx) :
m_Mutex(mtx)
{
}
private:
std::mutex &m_Mutex; // note the "&"
};
int main()
{
std::mutex mutex1;
Test t(mutex1);
return 0;
}
做个参考就可以了
对于 class 的所有实例,您的互斥量必须相同,否则您在 class 的一个实例中执行的锁定不会对另一个实例有效.
#include <mutex>
#include <iostream>
using namespace std;
class Test
{
public:
Test(mutex &mtx) :
m_Mutex(mtx)
{
m_Mutex.lock();
i++;
cout << "Test " <<i<<endl;
m_Mutex.unlock();
}
private:
mutex& m_Mutex;
static int i;
};
int Test::i =0;
int main()
{
mutex mutex1;
Test t1(mutex1);
Test t2(mutex1);
return 0;
}
只需将互斥锁保留在您的 class 中(可能作为静态成员),如果您需要允许其他 classes 使用它,请提供访问权限:
class Test
{
public:
Test() {}
std::mutex &mux() { return m_Mutex; }
private:
mutex m_Mutex;
};
甚至这样:
class Test {
public:
using lock_t = std::scoped_lock<std::mutex>;
Test() {}
lock_t lock() { return lock_t( m_Mutex ); }
private:
mutex m_Mutex;
};
用法:
Test t;
{
auto lock = t.lock();
// object t is locked till end of the block
}