gpt4 book ai didi

c++ - 分离线程 : mutex destroyed while busy Error C++

转载 作者:太空宇宙 更新时间:2023-11-04 15:55:53 34 4
gpt4 key购买 nike

我完全是 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;

}

好吧,我面临的问题是出现了以下错误:

忙时销毁互斥量

我已经调查并且我已经阅读(如果我错了请纠正我)发生这种情况是因为调用函数,在我的例子中是 launch_threads(),在它内部创建的本地线程仍在运行时结束,因此互斥锁仍然可以由某个线程(正忙)拥有,给出该错误。事实上,线程内部的处理并没有真正结束。

我的问题是:如何避免该错误?

我还读到,不将线程作为局部变量可能会解决问题。在这种情况下,如果我将带有参数的函数传递给它们,我如何将线程声明为全局线程?

与主题相关的额外问题:使用 std::lock_guard lock(m) 是否有助于避免该问题?

提前致谢!

最佳答案

您启动一些线程并将它们分离。然后你让 main 终止进程的函数返回。该进程终止会杀死所有线程,并导致所有全局对象被破坏。

您应该只退出 main线程函数正在运行,它让分离的线程继续在进程中运行(然后在最后一个线程退出时退出)。

目前在C++标准库中没有办法退出一个线程,所以你必须使用系统相关的函数。例如,在 POSIX 系统(如 Linux 或 macOS)中,您使用 pthread_exit 功能。


当然还有另外两种可能的解决方案:

  1. 不要分离线程,join他们在退出之前 main .不过,这可能并不总是可行或需要的。

  2. main 中等待使用线程已经退出的某种其他类型的等待或轮询机制,使分离的线程退出。这可能也是不希望的。如果线程在线程内部设置了一个标志,表明 main 可能会出现问题函数检查,这可能导致线程在 main 之前实际上没有退出的竞争条件函数返回。

关于c++ - 分离线程 : mutex destroyed while busy Error C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58096994/

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