使用互斥量时尝试引用已删除的函数

Attempting to reference a deleted function when using a mutex

我在处理项目时遇到奇怪的错误。我创建了一个超级简单的示例来重现错误。

我创建了一个 class。在这个 class 中,我想做的是为我的 class 提供一种 'getter' 函数来填充 struct 的值。在主应用程序中,用户将实例化此 struct,将其传递给成员函数,并能够在 return 上读取 struct 中的值。由于实际 class 的设计,这必须在单独的线程中发生。这是我拥有的:

myClass.h:

#ifndef __MY_CLASS_H__
#define __MY_CLASS_H__

#include <mutex>

class myClass {
public:
    struct my_struct_s {
        int field1;
        short field2;
    };

    int get_data(my_struct_s & my_struct);

private:

};

#endif /* __MY_CLASS_H__ */

myClass.cpp:

#include "myClass.h"

int myClass::get_data(struct my_struct_s & my_struct)
{
    int var1 = 5;
    char var2 = 2;

    my_struct.field1 = var1;
    my_struct.field2 = var2;

    return 0;
}

Main.cpp:

#include "myClass.h"
#include <iostream>
#include <thread>
#include <Windows.h>

bool thread_running;
std::thread thread;

void run_thread(myClass & lmyClass)
{
    myClass::my_struct_s my_struct;

    while (thread_running) {
        lmyClass.get_data(my_struct);

        std::cout << my_struct.field1 << std::endl;
        std::cout << my_struct.field2 << std::endl;

        Sleep(100);
    }
}

int main(int argc, char *argv[])
{
    myClass lmyClass; 

    thread_running = true;
    thread = std::thread(run_thread, lmyClass);

    Sleep(1000);
    thread_running = false;

    if (thread.joinable()) {
        thread.join();
    }

    getchar();

    return 0;
}

它按预期工作。但是,由于 class 的异步特性,我需要互斥体来保护 class.

中不同线程处理的数据

如果我添加 std::mutext 作为我的 class 的私有成员,当我尝试 运行 代码时收到以下信息:

Error 1 error C2280: 'std::mutex::mutex(const std::mutex &)' : attempting to reference a deleted function ...

1) 我正在尝试了解为什么会收到此错误。

2)(这部分更基于意见),根据信息,这是 'getter' 填写 public 结构的方式,以便有人实施我的 class 能把里面的变量搞乱就好好设计了吗?有更好的方法吗?

你在myclass中没有复制构造函数,所以编译器给它一个默认的复制构造函数。这将尝试复制所有成员,包括您的 std::mutex不可复制。正如编译器错误所说,它被标记为已删除。

您需要定义自己的拷贝构造函数;您很可能希望它获取存储在被复制实例中的互斥锁,然后将它的所有其他成员复制到新实例。

动态而不是静态声明互斥体。

在您的 myClass class header 将互斥体声明为指针,如下所示:

mutex * mtx;

并在您的构造函数中初始化互斥锁,调用他的构造函数:

mtx = new std::mutex();