【发布时间】:2020-01-25 13:31:17
【问题描述】:
我完全是 C++ 和线程的初学者。我为我的问题做了一个非常简单的例子。在我提供的代码中,我创建线程并分离它们。每个线程执行不同的函数:一个包括将 int 推入队列,另一个读取该值并使用读取的值和函数的参数模拟长时间处理。队列对象受互斥体保护,因为它在两个线程之间共享。我知道我的代码有点愚蠢,但我已经让它代表了我真正的问题,它使用分离的线程和受互斥体保护的共享队列。
代码如下:
#include <mutex>
#include <iostream>
#include <thread>
#include <queue>
using namespace std;
std::queue<int> tasks;
std::mutex m;
void push_task(int arg) {
printf("[Pushing task into the queue]");
m.lock();
tasks.push(arg);
m.unlock();
}
void process_task(int number) {
printf("[Processing task from the queue]");
m.lock();
while (tasks.empty() == false){
int task = tasks.front();
tasks.pop();
printf("[Processing...]");
std::this_thread::sleep_for(std::chrono::milliseconds((task+number)*1000)); //simulate some execution
printf("[Task has been successfully processed]");
}
m.unlock();
}
int launch_threads(int nTask, int n){
int counter = 0;
while(counter < 8){
std::thread(push_task, nTask).detach();
std::thread(process_task, n).detach();
counter++;
}
printf("[Launch Threads Ends]");
return 0;
}
int main(){
launch_threads(0, 10000);
printf("[Main Ends]");
return 0;
}
好吧,我面临的问题是我收到以下错误:
mutex 在忙时被破坏
我已经调查并且我已经阅读(如果我错了,请纠正我)发生这种情况是因为调用函数(在我的例子中是 launch_threads())在它内部创建的本地线程仍在运行时结束,因此互斥锁仍然可以由某个线程拥有(正忙),给出该错误。事实上,线程内部的处理并没有真正结束。
我的问题是:我怎样才能避免这个错误?
我还读到不将线程作为局部变量可能会解决问题。在这种情况下,如果我将带有参数的函数传递给线程,如何将线程声明为全局线程?
与主题相关的额外问题:使用 std::lock_guard lock(m) 是否有助于避免该问题?
提前谢谢你!
【问题讨论】:
-
不要分离线程。加入他们。当您刚开始使用线程时,
detach()不应该出现在您的工具包中。
标签: c++ multithreading mutex