【问题标题】:Synchronizing Objects in Different Threads in Qt在 Qt 中同步不同线程中的对象
【发布时间】:2011-12-30 17:37:44
【问题描述】:

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

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

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

【问题讨论】:

  • 我是否正确理解您有这样的情况:Thread1 接收数据并将其传递给 Thread2 进行处理并等待 Thread2 完成后再读取下一个数据块?
  • 是的,确实如此,但同步是一个问题,因为信号/插槽不是一个选项
  • 如果线程 1 直到线程 2 完成处理它刚刚收到的数据才移动,为什么需要多线程?您只需要一个 Receive->Process 线程
  • 是的,我有新年作业:S。试图破解解决方案,而不是重新设计整个程序。

标签: c++ multithreading qt


【解决方案1】:

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

类似这样的:

#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 只是为了让您的线程仅在需要时才工作

【讨论】:

  • 我认为使用 QWaitCondition 是可行的方法。在我的解决方案中,我这样做了,因此两个线程都可以访问单个对象,然后它们就可以使用 QMutex 和 WaitCondtion 进行同步。解决问题后,我将发布示例代码的快照。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2013-04-02
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    相关资源
    最近更新 更多