【问题标题】:Barrier implementation using mutex & semaphore使用互斥量和信号量的屏障实现
【发布时间】:2013-12-07 16:09:40
【问题描述】:

这是一道面试题: 使用互斥锁和信号量实现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 是否只能使用互斥锁来实现?

【问题讨论】:

  • The Little Book of Semaphores 如果你想追求它,它可以很好地处理障碍。
  • @Duck 它提供了可重复使用的屏障解决方案。我正在寻找常规的屏障解决方案。

标签: c++ c mutex semaphore barrier


【解决方案1】:

互斥锁只允许一个线程执行一段代码并阻塞其他线程。我一直使用或制作在构造函数和析构函数上按范围锁定/解锁的类。你可以这样使用它:

void workToDo()
{
    CMutex mutex(sharedLockingObject);

    // do your code
}

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

【讨论】:

    猜你喜欢
    • 2016-08-30
    • 2013-12-30
    • 2011-04-20
    • 2013-11-30
    • 2012-12-09
    • 2017-08-24
    • 1970-01-01
    • 2015-10-25
    • 2011-06-24
    相关资源
    最近更新 更多