2013-11-22 119 views
0

這是一個訪問問題: 使用互斥量和信號量實現n線程之間的障礙。 我提出的解決方案:使用互斥量和信號量實現屏障

class Barrier { 
public: 
Barrier(unsigned int n) : _n(n),_count(0),_s(0) {} 
~Barrier() {} 
void Wait() { 
    _m.lock(); 
     _count++; 
     if (_count == _n) { _s.signal(); } 
    _m.unlock(); 
    _s.wait(); 
    _s.signal(); 
} 
private: 
    unigned int _n; 
    unigned int _count; 
    Mutex _m; 
    Semaphore _s; 
}; 

那是解決好? 只能使用互斥鎖來實現屏障嗎?

+0

[信號量小冊子](http://www.cs.ucr.edu/~kishore/papers/semaphores.pdf)如果你想追求它,它會有一個很好的障礙處理障礙。 – Duck

+0

@Duck提供可重複使用的屏障解決方案。我正在尋找定期的屏障解決方案。 – Yakov

回答

0

Mutexes正好只允許一個線程執行一段代碼並阻止其他線程。我一直使用或創建的類在構造函數和析構函數的範圍上鎖定/解鎖。你會這樣使用它:

void workToDo() 
{ 
    CMutex mutex(sharedLockingObject); 

    // do your code 
} 

當方法結束時,互斥量超出範圍,並調用析構函數。構造函數執行阻止鎖定,並且在取得鎖定之前不會解除阻止。這樣,您就不必擔心異常情況,從而導致您鎖定互斥鎖,從而在不應該阻止代碼的情況下進行鎖定。這個異常自然會解開範圍並調用析構函數。