使用互斥锁和信号量实现屏障

Barrier implementation using mutex & semaphore

本文关键字:信号量 实现      更新时间:2023-10-16

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

这个解决方案可以吗?Barrier只能使用互斥实现吗?

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

void workToDo()
{
    CMutex mutex(sharedLockingObject);
    // do your code
}

当该方法完成时,互斥锁将超出作用域,并调用析构函数。构造函数执行阻塞锁,并且在获取锁之前不会解除阻塞。这样,您就不必担心异常会给您留下锁定的互斥对象,这些互斥对象会在不应该阻止代码的时候阻止代码。异常将自然地解开作用域并调用析构函数。