QMutexLocker 類

QMutexLocker 類是簡化鎖定和解鎖互斥的方便類。 更多...

頭: #include <QMutexLocker>
qmake: QT += core

注意: 此類的所有函數 綫程安全 .

公共函數

QMutexLocker (QRecursiveMutex * mutex )
QMutexLocker (QMutex * mutex )
~QMutexLocker ()
QMutex * mutex () const
void relock ()
void unlock ()

詳細描述

鎖定和解鎖 QMutex 在復雜函數、語句 (或異常處理) 中,代碼容易齣錯且難以調試。QMutexLocker 可以用於這種狀況以確保互斥狀態始終定義良好。

應該在函數內創建 QMutexLocker,那裏 QMutex 需要被鎖定。互斥被鎖定當 QMutexLocker 被創建時。可以解鎖和重新鎖定互斥采用 unlock() and relock() 。若被鎖定,互斥會被解鎖當 QMutexLocker 被銷毀時。

例如,此復雜函數鎖定 QMutex 當進入函數時並在所有退齣點解鎖互斥:

int complexFunction(int flag)
{
    mutex.lock();
    int retVal = 0;
    switch (flag) {
    case 0:
    case 1:
        retVal = moreComplexFunction(flag);
        break;
    case 2:
        {
            int status = anotherFunction();
            if (status < 0) {
                mutex.unlock();
                return -2;
            }
            retVal = status + flag;
        }
        break;
    default:
        if (flag > 10) {
            mutex.unlock();
            return -1;
        }
        break;
    }
    mutex.unlock();
    return retVal;
}
					

此範例函數在開發過程中將變得更復雜,從而增加瞭發生錯誤的可能性。

使用 QMutexLocker 能大大簡化代碼,並使之更可讀:

int complexFunction(int flag)
{
    QMutexLocker locker(&mutex);
    int retVal = 0;
    switch (flag) {
    case 0:
    case 1:
        return moreComplexFunction(flag);
    case 2:
        {
            int status = anotherFunction();
            if (status < 0)
                return -2;
            retVal = status + flag;
        }
        break;
    default:
        if (flag > 10)
            return -1;
        break;
    }
    return retVal;
}
					

現在,互斥將始終被解鎖當 QMutexLocker 對象被銷毀時 (當函數返迴時,因為 locker 是自動變量)。

相同原理也適用於拋齣、捕捉異常的代碼。在鎖定互斥的函數中未被捕獲的異常沒有辦法解鎖互斥,在把異常嚮上傳遞給調用函數的堆棧之前。

QMutexLocker 還提供 mutex() 成員函數以返迴互斥在那裏 QMutexLocker 正在運轉。這對需要訪問互斥的代碼很有用,譬如 QWaitCondition::wait ()。例如:

class SignalWaiter
{
private:
    QMutexLocker locker;
public:
    SignalWaiter(QMutex *mutex)
        : locker(mutex)
    {
    }
    void waitForSignal()
    {
        ...
        while (!signalled)
            waitCondition.wait(locker.mutex());
        ...
    }
};
					

另請參閱 QReadLocker , QWriteLocker ,和 QMutex .

成員函數文檔編製

QMutexLocker:: QMutexLocker ( QRecursiveMutex * mutex )

構造 QMutexLocker 和鎖 mutex 。互斥會被解鎖 ( unlock () 被調用) 當 QMutexLocker 被銷毀時。若 mutex is nullptr ,QMutexLocker 什麼都不做。

該函數在 Qt 5.14 引入。

另請參閱 QMutex::lock ().

QMutexLocker:: QMutexLocker ( QMutex * mutex )

構造 QMutexLocker 和鎖 mutex 。互斥會被解鎖當 QMutexLocker 被銷毀時。若 mutex is nullptr ,QMutexLocker 什麼都不做。

另請參閱 QMutex::lock ().

QMutexLocker:: ~QMutexLocker ()

銷毀 QMutexLocker 並解鎖在構造函數中被鎖定的互斥。

另請參閱 QMutex::unlock ().

QMutex *QMutexLocker:: mutex () const

返迴互斥在那裏 QMutexLocker 正在運轉。

void QMutexLocker:: relock ()

重新鎖定被解鎖的互斥鎖定器。

另請參閱 unlock ().

void QMutexLocker:: unlock ()

解鎖此互斥鎖定器。可以使用 relock() 以再次鎖定它。它不需要被鎖定當銷毀時。

另請參閱 relock ().