gpt4 book ai didi

c++ - 试图引用已删除的函数、具有互斥成员的结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:13 27 4
gpt4 key购买 nike

这是我的问题。

我有这样的结构。

struct threadInfo
{
std::condition_variable cv;
std::mutex m;
int priorityLevel;
};

在构建我的代码时出现此错误

Error C2280 threadInfo::threadInfo(const threadInfo &): attempting to reference a deleted function PriorityListMutex

根据我的理解,这意味着 threadInfo 的构造函数被调用,它试图复制 mutex,这是不可能的。

我在 C++ 方面经验不多,虽然我多少能理解发生了什么,但我不确定如何尝试解决这个问题。任何帮助都会很棒!

这里是使用ThreadInfo的代码

    threadInfo info;
info.priorityLevel = priority;

priorityListMutex.lock();
for (std::list<threadInfo>::iterator it = threadList.begin(); it != threadList.end(); it++)
{
if ((*it).priorityLevel < info.priorityLevel)
{
threadList.insert(it, info);
break;
}
else if (it == threadList.end())
{
threadList.push_back(info);
break;
}
}
priorityListMutex.unlock();
std::unique_lock<std::mutex> lock(info.m);
info.cv.wait(lock);

我猜结构正在那里的某处被复制,但我完全不知道在哪里。

最佳答案

您可以通过避免复制并将结构直接放置在列表中来解决您的问题。不过,这确实需要自定义构造函数。我已将您的代码示例缩短为仅显示放置部分:

#include <mutex>
#include <condition_variable>
#include <list>

struct threadInfo
{
explicit threadInfo(int prio) : priorityLevel(prio) {}

std::condition_variable cv;
std::mutex m;
int priorityLevel;
};

int main()
{
std::list<threadInfo> threadList;

int priorityLevel = 0;

for (std::list<threadInfo>::iterator it = threadList.begin(); it != threadList.end(); it++)
{
if ((*it).priorityLevel < priorityLevel)
{
threadList.emplace(it, priorityLevel);
break;
}
else if (it == threadList.end())
{
threadList.emplace_back(priorityLevel);
break;
}
}

return 0;
}

关于c++ - 试图引用已删除的函数、具有互斥成员的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44528812/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com