【发布时间】:2018-06-18 08:23:08
【问题描述】:
我正在研究Qt Blocking Master example 以了解使用Qt 进行串行通信。在此示例中,串行通信以同步方式完成,因此,为了保持 GUI 响应,创建了一个单独的(非 GUI)线程来处理串行通信。我不明白的是在负责通信的线程(即MasterThread)中使用互斥锁来同步线程的部分:
注意,transaction() 方法是在主线程中调用的,但是 请求在 MasterThread 线程中提供。 MasterThread 数据 成员在不同的线程中同时读取和写入,因此 QMutex 类用于同步访问。
void MasterThread::transaction(const QString &portName, int waitTimeout, const QString &request) { QMutexLocker locker(&mutex); this->portName = portName; this->waitTimeout = waitTimeout; this->request = request; if (!isRunning()) start(); else cond.wakeOne(); }[MasterThread 运行方法]
void MasterThread::run() { bool currentPortNameChanged = false; mutex.lock(); QString currentPortName; if (currentPortName != portName) { currentPortName = portName; currentPortNameChanged = true; } int currentWaitTimeout = waitTimeout; QString currentRequest = request; mutex.unlock();在任何情况下都不应调用 transaction() 方法 与获取数据的进程同时进行。注意,虽然 QString 类是可重入的,它不是线程安全的。因此,它不是 建议在请求线程中读取串口名称,以及 超时或在另一个线程中请求数据。 MasterThread 类可以 一次只处理一个请求。
我的问题:
我不明白 Mutex 的必要性。我的理由是只有一个线程(在
Dialog类中创建)处理通信,因此不存在竞争条件,也不需要同步。我对上面引用的最后一句话更加困惑(即“在任何情况下......”)。 “[另一个] 进程获取数据”是什么意思?我们这里只有一个进程(即整个应用程序)和两个线程(一个用于 GUI,一个用于串行通信)并且这两个线程没有共享数据,这不是真的吗?为什么
QString的线程安全在这里很重要?
【问题讨论】:
标签: c++ multithreading qt serial-communication