繁体   English   中英

C ++将互斥量传递给构造函数中的成员变量

[英]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;
} 

现场观看: https : //wandbox.org/permlink/6YJFG3MI7m7RbfoL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM