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

Является ли это решение Ok? Может ли барьер быть реализован с использованием только мьютексов?

+0

[Маленькая книга семафоров] (http://www.cs.ucr.edu/~kishore/papers/semaphores.pdf) имеет достойное отношение к барьерам, если вы хотите преследовать его. – Duck

+0

@ Duck это дает многоразовое решение барьера. Я ищу регулярное решение барьера. – Yakov

ответ

0

Мьютексы предназначены только для того, чтобы один поток мог выполнять кусок кода и блокировать другие потоки. Я всегда использовал или делал классы, которые блокируют/разблокируют по объему на конструкторе и деструкторе. Вы бы использовать его как это:

void workToDo() 
{ 
    CMutex mutex(sharedLockingObject); 

    // do your code 
} 

Когда метод заканчивается, мьютекс выходит из области видимости, и вызывает деструктор. Конструктор выполняет блокировку блокировки и не разблокируется до тех пор, пока не будет получен замок. Таким образом, вам не нужно беспокоиться об исключениях, оставляя вас заблокированными мьютексами, которые блокируют код, когда это не должно. Исключение, естественно, разгадает сферу действия и вызовет деструкторов.

Смежные вопросы