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

时间:2011-12-30 17:37:44

标签: c++ multithreading qt

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

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

如何在不使用全局互斥锁和等待条件的情况下同步两个不同的线程?

2 个答案:

答案 0 :(得分:2)

您可以使用互斥锁。每次从队列中提取“请求”时锁定,并在每次要追加到队列时锁定。这样你可能有

类似的东西:

#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仅用于使您的线程仅在需要时工作

答案 1 :(得分:0)

您的命令对象可以包含“sync”对象,因此发送方可以等待此对象,处理器线程可以在完成时发出信号。同步对象只需要一个布尔值和一个QWaitcondition,它不应该是全局的。