使用互斥量和信号量的屏障实现
Posted
技术标签:
【中文标题】使用互斥量和信号量的屏障实现【英文标题】: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 它提供了可重复使用的屏障解决方案。我正在寻找常规的屏障解决方案。 【参考方案1】:互斥锁只允许一个线程执行一段代码并阻塞其他线程。我一直使用或制作在构造函数和析构函数上按范围锁定/解锁的类。你可以这样使用它:
void workToDo()
CMutex mutex(sharedLockingObject);
// do your code
当方法完成时,互斥体超出范围,并调用析构函数。构造函数执行阻塞锁,并且在获得锁之前不会解除阻塞。这样您就不必担心异常会给您留下锁定的互斥锁,这些互斥锁会在不应该的情况下阻塞代码。异常自然会解开作用域并调用析构函数。
【讨论】:
以上是关于使用互斥量和信号量的屏障实现的主要内容,如果未能解决你的问题,请参考以下文章