2013-10-03 53 views
2

我需要實現一個有兩種方式的互斥體:1.保護跨多個類的資源,以及2.保護類中某個方法的資源插槽並且可以是可重入的。例如(僞C++):QMutex - 這是否意味着我需要一個全局互斥變量

Class A { 
    function aaa() { 
    QMutex mutex; 
    mutex.lock(); 
    globalvar++; 
    mutex.unlock() 
    } 
} 

Class B { 
    function bbb() { 
    QMutex mutex; 
    mutex.lock(); 
    globalvar++; 
    mutex.unlock() 
    } 
} 
  1. 我讀this posting其說,方案2被覆蓋,因爲A.aaa由A.aaa中斷的處理(以某種方式的Qt/OS知道它是相同的資源的保護,對嗎?

  2. 至於A.aaa和B.bbb保護相同的資源,我認爲它不會工作,因爲QT/OS不知道它在相同的資源/互斥?這是否意味着變量互斥體需要是一個全局的,以便多個不相關的類可以安全地訪問它?

+1

互斥鎖與受保護資源關聯,而不是訪問此資源的類。所以,在你的簡單情況下,當資源是全局變量時,互斥量也應該是全局變量。 –

+0

操作系統不知道任何有關受保護的資源。在堆棧上創建的不與其他線程共享的互斥鎖不會保護任何內容。所有訪問globalvar的線程必須共享相同的互斥量實例。因此,互斥量應與要保護的數據處於相同的範圍。 –

回答

1

我讀過這篇文章,其中說明了由於A.aaa被A.aaa中斷而被覆蓋的情況2(不知何故,Qt/OS知道它是被保護的同一資源。對?

是的,雖然看起來你應該在這種情況下使用QMutexLocker,當鎖定綁定到範圍以避免忘記解鎖的錯誤。這在C++中被稱爲RAII

嚴格來說,是QMutex負責鎖定資源。

至於A.aaa和B.bbb保護相同的資源,我認爲它不會工作,因爲Qt/OS不知道它是相同的資源/互斥體?這是否意味着變量互斥需要成爲一個全局變量,以便多個不相關的類可以安全地訪問它?

這是一種罕見的情況,但是。儘管您可能想要將全局變量包裝爲類型,如自定義結構。

+0

謝謝 - 我會開始一個新的線程來闡明下一步。 – TSG

+0

什麼是將全局變量包裝在一個結構中對我來說呢? – TSG

相關問題