Qt中不同线程中的对象同步
Synchronizing Objects in Different Threads in Qt
现在在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,不应该是全局的。
相关文章:
- 同步对象
- 从多个线程对共享对象的同步方法调用
- 如果我确定只有一个线程一次处理指针/对象,则C/C 仍应使用同步
- 我们是否需要在C++中同步局部对象变量
- 如何使Windows ListView控件和它们映射到的对象保持同步
- 与本地对象同步
- 如何安全地将包含的对象(菜单项)与需要容器(菜单)的API同步
- 通过使用覆盖操作员的代理来同步对象
- 静态对象的同步
- 同步线程创建和销毁(静态)对象
- RAII 是否可以在不同步的情况下有效地在线程之间共享不可变对象
- 同步对象以等待而不阻止C++中的 UI(C++生成器)
- 此同步对象实现线程是否安全
- C++(可能还有 Java)如何锁定对象以进行同步
- 简单的多线程帮助?C++、等待单一对象和同步
- 设计面向对象的同步接收器和发射器
- 在同一进程中使用的两个模块中具有同步对象的通用名称是否安全
- 如何在C++或Winapi中转移同步对象的所有权
- 如何制作同步对象的字典
- Qt中不同线程中的对象同步