Qt中不同线程中的对象同步

Synchronizing Objects in Different Threads in Qt

本文关键字:对象 同步 Qt 线程      更新时间:2023-10-16

现在在Qt我面临的问题是,我有2个线程,有2个不同的对象。这些对象不是qobject,因此它们不能使用信号/插槽进行通信。第一个线程是主线程,第二个线程处于无限循环中,无限循环使用队列处理命令对象。

主线程必须等待处理线程完成请求。

如果不使用全局互斥锁和等待条件,我该如何同步两个不同的线程?

您可以使用互斥锁。每次从队列中提取"请求"时锁定,每次想要添加到队列时锁定。这样你就可以有

像这样:

#include <QMutex>
#include <QWaitCondition>
class processingThread
{
public:
    void appendToQueue(Request req)
    {
       sync.lock();
       queue.append(req);
       sync.unlock();
       cond.wakeAll();            
    }
protected:
    void run()
    {
        while(1)
        {
           sync.lock();
           QWaitCondition wait(&sync);
           Request current = queue.takeFirst();
           // process request
           sync.unlock()
        }
    }
private:
    QList<Request> queue;
    QMutex sync;
    QWaitCondition cond;
};

你现在可以从任何线程调用processingThread::appendToQueue并获得数据同步。您可以使用此模式同步线程内的任何数据。只要记住锁定你想要同步的数据的访问权限。请注意,QWaitCondition仅在需要时才使线程工作

你的命令对象可以包含一个"sync"对象,这样发送者可以等待这个对象,处理器线程可以在它完成时发出信号。sync对象只需要一个布尔值和一个QWaitcondition,不应该是全局的。