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;
} 

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

只需将互斥锁保留在您的 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
}