2013-11-22 120 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 
} 

当方法结束时,互斥量超出范围,并调用析构函数。构造函数执行阻止锁定,并且在取得锁定之前不会解除阻止。这样,您就不必担心异常情况,从而导致您锁定互斥锁,从而在不应该阻止代码的情况下进行锁定。这个异常自然会解开范围并调用析构函数。