[英]C++ passing a mutex to a member variable in the constructor
将互斥量传递给班级时遇到问题。 我有一个名为Test
的类,其成员变量名为m_Mutex
。 在构造函数中,我想将参数互斥锁传递给m_Mutex
。
我的课:
#include <mutex>
class Test
{
public:
Test(mutex &mtx) :
m_Mutex(mtx)
{
}
private:
mutex m_Mutex;
};
我的主要:
int main()
{
mutex mutex1;
Test t(mutex1);
return 0;
}
错误:
函数“ std :: mutex :: mutex(const std :: mutex&)”(在“ c:\\ Program Files(x86)\\ Microsoft Visual Studio \\ 2017 \\ Professional \\ VC \\ Tools \\ MSVC \\ 14.11的第88行声明。 25503 \\ include \\ 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。
在构造函数中,我想将参数互斥锁传递给
m_Mutex
不幸的是你不能。 std::mutex
不可复制且不可移动。 如果要在其他地方声明互斥锁,可以做的一件事是存储对互斥锁的引用,例如
class Test
{
public:
Test(mutex &mtx) :
m_Mutex(mtx)
{
}
private:
mutex& m_Mutex;
};
#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 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
}
只是作为参考
对于您的类的所有实例,您的互斥锁必须相同,如果不是这样,则您在该类的一个实例中执行的锁将不会对另一个实例激活。
#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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.