multithreading - 使用 QtConcurrent 运行函数时使用 QMutexLocker 保护共享变量

标签 multithreading qt qthread qtconcurrent qmutex

我使用 QtConcurrent 在后台线程中执行发现过程:

// Start the discover process in the background thread so it doesn't block the gui
*m_Future = QtConcurrent::run(this, &Controller::StartDiscover);
m_Watcher->setFuture(*m_Future);

我以前没有放置互斥体来保护该函数内的共享变量,这些变量可以在后台线程运行时访问。这在我的“扫描”操作期间导致了一些随机锁定。

我现在已经通过在该函数的开头创建 QMutexLocker 来实现互斥锁。

int Controller::StartDiscover() {

    // Lock mutex
    QMutexLocker ml(&m_Mutex);

    // Zero
    m_NumberBoundDevices = 0;

    // Update to scanning
    m_Status = Scanning;

    // Discover slaves
    int numberAttachedSlaves = m_Client->DiscoverSlaves();
    m_Client->setTimeout(20000); // 20 Second Timeout

    if ( numberAttachedSlaves > 0 ) {

        int cnt = 0;
        while ( cnt < 3 ) {

                for (int slave = 1 ; slave <= numberAttachedSlaves ; slave++ ) {

                    // Get information about this slave
                    QDBusPendingReply<uchar> reply = m_Client->SlaveService(slave,m_Packet);
                    reply.waitForFinished(); // Wait for it to complete
                    if (!reply.isValid()) {
                        m_Client->SlaveService(slave,m_Packet);
                        reply.waitForFinished();
                    }
                    if ( reply.isError() ) {
                        QString errorMsg = reply.reply().errorMessage();
                    }

                }

                // Increment counter
                cnt++;
        }

    }

    // Update
    m_NumberBoundDevices = numberAttachedSlaves;

    // Return the number of devices discovered
    return numberAttachedSlaves;

}

这会保护函数内的所有共享变量吗?或者,我应该在每个 m_* 变量周围显式使用 QMutex.lock() 和unlock() 吗?

谢谢

最佳答案

考虑一下:-

char buffer[]
void ReadFromBuffer()
{
    QMutexLocker ml(&m_Mutex);
    // read contents of buffer
}

void WriteToBuffer()
{
    QMutexLocker ml(&m_Mutex);
    // write to buffer
}

如果 ReadFromBuffer 与 WriteToBuffer 在单独的线程中运行,您需要确保读取和写入不会同时发生。

如果一个线程在 WriteToBuffer 中执行并锁定互斥锁,则当另一个线程进入 ReadFromBuffer 并执行其互斥锁锁定器时,它会检查互斥锁是否已锁定。如果它被锁定,则线程暂停并等待它被解锁。当 QMutexLocker 对象超出锁定互斥锁的第一个函数的范围时,就会发生这种情况。

这就是为什么所有访问共享对象的代码都需要 QMutexLocker。

关于multithreading - 使用 QtConcurrent 运行函数时使用 QMutexLocker 保护共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19981161/

相关文章:

qt - QML:等到动画完成

c++ - 无法使用 QtNetwork,因为应用程序使用不同的线程

插槽断开后的 Qt 信号

c++ - QThread 插槽行为

java - 检查和控制实际并行运行的应用程序线程数

android - Realm :添加的记录,无法在其他线程中检索

qt - 如何使用Qt读取文件并快速显示?

c++线程,重复/缺少线程

c++ - 带有任务调度程序的 IOCP(线程构建 block )

c++ - 如何在 Qt 中获取指向弹出对话框的指针,这会阻塞 QTest 中的 UI 线程