为什么我的多线程作业队列崩溃
Why does my multithreaded job queue crash?
我正试图在c++中运行一个多线程作业队列。作为一个例子,我测试了以下程序:
#include <thread>
#include <mutex>
#include <list>
#include <vector>
class Job
{
public:
void Run(void)
{
}
};
class Queue
{
private:
std::recursive_mutex mtxJobs;
std::list<Job *> mJobs;
public:
Job *Take(void)
{
std::scoped_lock(mtxJobs);
if (mJobs.size() > 0)
{
Job *pJob(mJobs.front());
mJobs.pop_front();
return pJob;
}
else
return NULL;
}
void Add(Job *pJob)
{
std::scoped_lock(mtxJobs);
mJobs.push_back(pJob);
}
size_t Size(void)
{
std::scoped_lock(mtxJobs);
return mJobs.size();
}
};
void Work(Queue &q)
{
Job *pJob;
while ((pJob = q.Take()) != NULL)
{
pJob->Run();
delete pJob;
}
}
int main()
{
size_t i;
Queue q;
for (i = 0; i < 1000; i++)
q.Add(new Job);
std::vector<std::thread> threads(4);
for (i = 0; i < 4; i++)
threads[i] = std::thread(Work, std::ref(q));
for (i = 0; i < 4; i++)
threads[i].join();
return 0;
}
当我这样运行它时:
g++ -std=c++17 -lpthread test.cpp -o test && ./test
它与SEGFAULT相撞。有人知道为什么吗?
GDB表示访问列表"mJobs"时总是发生崩溃。但是,锁应该防止并发修改吗?
有人能帮我吗?
您在没有同步的情况下访问队列:
std::scoped_lock(mtxJobs);
这是一个名为mtxJobs
的局部变量,创建时不带任何参数,并隐藏互斥对象mtxJobs
成员。当创建scoped_lock
而不带参数时,它不会根据引用执行任何操作。
你需要写:
std::scoped_lock lock(mtxJobs);
现在,您的互斥锁被锁定在scoped_lock
对象的ctor中。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 为什么我的多线程作业队列崩溃
- 使用"Task"函数指针队列定义作业管理器
- 优先级经常更改的作业优先级队列的数据结构
- 为什么下面的使用链表实现线性队列的代码返回垃圾值然后崩溃
- C++无锁队列与多个线程一起崩溃
- 当我插入元素时,C 优先级队列会崩溃
- 队列:取消队列功能使程序崩溃
- 将包含指向该类型队列的指针的结构推送到队列上时发生运行时崩溃
- 从队列中显示2D阵列后程序崩溃
- 队列用户APC - 抛出异常崩溃,可能是 mingw 错误
- 在我推入队列之前崩溃
- 尝试创建队列 - C++崩溃的问题
- 线程池和作业队列体系结构
- 创建动态循环队列,元素输出正常,但程序崩溃
- 从队列中取出队列时程序崩溃
- 等待Boost的空闲队列.原子示例崩溃
- c++队列多重读取等待作业完成
- 无锁定作业队列(多次读/写)-请求审查
- 回调作业队列中到达的任务