使用互斥锁& amp;屏障实现屏障信号

时间:2013-11-22 17:13:10

标签: c++ c mutex semaphore barrier

这是一个面试问题: 使用互斥锁和信号量在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;
};

这个解决方案好吗? 屏障只能使用互斥锁来实现吗?

1 个答案:

答案 0 :(得分:0)

互斥锁正是为了只允许一个线程执行一大块代码并阻止其他线程。我总是在构造函数和析构函数上使用或创建按范围锁定/解锁的类。你会这样使用它:

void workToDo()
{
    CMutex mutex(sharedLockingObject);

    // do your code
}

当方法完成时,互斥锁超出范围,并调用析构函数。构造函数执行阻塞锁定,并且在获取锁定之前不会解除阻塞。通过这种方式,您不必担心会出现异常情况,从而阻止代码阻塞代码。该异常自然会解析范围并调用析构函数。