Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的多线程作业队列崩溃? 我试图在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; }_C++_Multithreading_Queue_Mutex - Fatal编程技术网

为什么我的多线程作业队列崩溃? 我试图在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; }

为什么我的多线程作业队列崩溃? 我试图在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; },c++,multithreading,queue,mutex,C++,Multithreading,Queue,Mutex,它因故障而崩溃。有人知道为什么吗 GDB表示当访问列表“mJobs”时,崩溃总是发生。但是,锁应该防止并发修改,对吗 有人能帮我吗?您正在不同步地访问队列: std::scoped_lock(mtxJobs); 这是一个名为mtxJobs的局部变量,创建时不带任何参数,并隐藏互斥体mtxJobs成员。当创建的作用域锁定没有参数时,它不会根据参数执行任何操作 你需要写: std::scoped_lock lock(mtxJobs); 现在,您的互斥锁被锁定在 StopeDyLoo> Note

它因故障而崩溃。有人知道为什么吗

GDB表示当访问列表“mJobs”时,崩溃总是发生。但是,锁应该防止并发修改,对吗


有人能帮我吗?

您正在不同步地访问队列:

std::scoped_lock(mtxJobs);
这是一个名为
mtxJobs
的局部变量,创建时不带任何参数,并隐藏互斥体
mtxJobs
成员。当创建的
作用域锁定
没有参数时,它不会根据参数执行任何操作

你需要写:

std::scoped_lock lock(mtxJobs);

现在,您的互斥锁被锁定在<代码> StopeDyLoo> Note +,而不是<代码>新< /代码> ING和<代码> Debug < /Cord> ING>代码>作业S,考虑传递。它明确声明了
作业
的所有权,并且几乎可以保证在过程中出现任何问题时将其释放。是的。这就是为什么最好使用
lock\u-guard
来代替。我怎么会错过这个!我像你说的那样改了,现在我再也没有撞车了。非常感谢。
std::scoped_lock lock(mtxJobs);