Qt信号槽多线程死锁
qt signal-slot multithreading deadlocks
在我的代码中,一个工作线程向gui线程发出一个信号。信号和插槽通过Qt::BlockingQueuedConnection连接。
当closeEvent
应用程序试图停止工作线程,然后才完成事件时。
调用工作线程的函数:
void stop() {
_isFinished = true;
wait();
}
工作线程依次检查_isFinished
条件,如果没有设置,则发出信号。
想象下列情况
The worker Gui Thread
================= =================
if (!_isFinished) -----------------
----------------- _isFinished = true;
----------------- wait();
emit mySignal(); -----------------
显然,两个线程都会被锁死锁。
如果我添加一个互斥锁,那么你会发现另一个死锁的情况。当工作线程锁定互斥锁时,gui线程将被阻塞。因此,发出的信号将锁定工作线程。
我该如何处理?
我是这么看的
在主线程中,你不需要等待worker退出。相反,你的closeEvent
应该看起来像这样:
if (workerThread->isRunning())
{
workerThread->stop();
event->ignore();
}
要使此工作,您还需要关闭主窗口,当工作线程完成:
connect(workerThread, SIGNAL(finished()), SLOT(close()));
最后,所有对_isFinished
(以及工作线程中的所有其他变量)的操作都应该发生在工作线程中。您可以使用一个简单的技巧来实现它:
WorkerThread.h
public:
void stop();
protected slots:
void p_stop();
protected:
QMutex mutex;
WorkerThread.cpp
void WorkerThread::stop()
{
staticMetaObject.invokeMethod(this, "p_stop", Qt::QueuedConnection);
}
void WorkerThread::p_stop();
{
QMutexLocker locker(&mutex);
_isFinished = true;
}
在gui线程中,您可以使用QEventLoop进行等待。像这样:
void stop() {
QEventLoop eventloop;
connect(&theWorkerThread, &QThread::finished, &eventloop, QEventLoop::quit);
_isFinished = true;
eventloop.exe();
}
相关文章:
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 对全局变量的多线程访问:我应该使用互斥锁吗?
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 多线程Windows GUI应用程序中的死锁
- C++ 多线程中的锁和条件变量问题
- parallel_for中互斥锁的多线程替代方案
- 我们是否需要互斥锁来执行多线程文件 IO
- 通知所有在多线程C++不起作用.导致死锁
- 使用OpenSSL和锁随机崩溃的多线程程序
- 多线程:何时调用互斥锁
- C++ 多线程和互斥锁
- 对于多线程应用程序中的显示任务,原子锁或互斥锁是必须的吗
- FFMPEG:多线程解码死锁
- 如何在C++Qt程序中调试多线程死锁
- 如何在这个小的多线程程序中调试死锁
- Qt信号槽多线程死锁
- 多线程应用程序中的死锁检测
- 避免多线程应用程序中潜在的死锁/内存泄漏
- 多线程死锁:这种设计会导致死锁吗?
- 什么是无锁多线程编程