2011-11-11 113 views
0

我想知道哪些用法對Mutex更好。它來到我的腦海中2用法是:QMutexLocker和QMutex的更好用法是什麼?

1)

Qlist getList() 
    { 
     QMutexLocker locker(&m_mutex); 
     return m_list; 

    } 

    for (int i =0 ;i < getList.count ; i++) 
    { 
      obj = getList.at(i) 
      //some work 
      // on obj    
    } 

2)

Qlist getList() 
    { 
     return m_list; 

    } 

    { 
    QMutexLocker locker(&m_mutex); 
    for (int i =0 ;i < getList.count ; i++) 
    { 
      obj = getList.at(i)<br> 
      //some work 
      // on obj     
    } 
    } 

總之,是能夠更好地保護列表無論正在使用它,或者它是可以將get_list函數中的互斥鎖從列表返回?

+2

getList之外的代碼塊,同一類的其他方法是什麼?另外:Horrid格式。 – themel

回答

1

鎖定和解鎖可能是一項昂貴的操作,但長時間鎖定資源可能會阻止其他線程繼續工作。因此,如果某些「在obj上工作」需要的時間太長,我會鎖定SomeFuntion(),否則會在for循環外部鎖定。如此說來,我也會保持設計清潔:這意味着如果具有for循環的部分不應該知道該互斥體(例如在不同的類中),則將鎖定SomeFunction,而不管操作的長度,或者我會將互斥鎖移動到別的地方。 當然記得要記錄哪個方法是線程安全的,哪個不是。

PS:從您發佈的代碼是很難理解,如果兩個塊是在同一類或不

3

我不明白你爲什麼會鎖定在吸氣互斥。您在此處實現的所有操作都會阻止其他受保護的部分運行,同時執行QList淺拷貝。

當您在執行QList上的操作時需要鎖定互斥鎖,該操作需要與對QList的任何其他訪問隔離開來。循環中QList所做的工作的性質以及其他線程如何與其同時進行交互將決定是否需要鎖定它。

如果沒有其他線程可以在循環過程中更改元素的數量,那麼僅在每個元素上執行的工作周圍鎖定循環體可能是安全的(它仍然取決於其他線程可能對內容執行的操作的QList),否則鎖定在循環體外部。鎖定在獲取者中並沒有達到任何效果。

相關問題