2013-11-22 3 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 – Duck

+0

재사용 장벽 해결책이다 정규 차단 솔루션을 찾고 있습니다. – Yakov

답변

0

뮤텍스는 코드의 덩어리를 실행하고 다른 스레드를 차단 하나 개의 스레드를 허용하는과 동일합니다. 저는 항상 생성자와 소멸자의 범위에 따라 잠금/잠금 해제하는 클래스를 사용하거나 작성했습니다. 다음과 같이 사용하십시오 :

void workToDo() 
{ 
    CMutex mutex(sharedLockingObject); 

    // do your code 
} 

이 메서드가 끝나면 뮤텍스는 범위를 벗어나서 소멸자를 호출합니다. 생성자는 차단 잠금을 수행하고 잠금을 얻을 때까지 차단을 해제하지 않습니다. 이렇게하면 코드를 차단해야하는 잠긴 mutex를 남겨 두는 예외에 대해 걱정할 필요가 없습니다. 예외는 자연스럽게 범위를 풀고 소멸자를 호출합니다. 당신이 그것을 추구하려는 경우