Реализация барьера с использованием мьютекса и семафора

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;
};

Это решение? Может ли Барьер быть реализован только с использованием мьютексов?

  • 0
    Маленькая Книга Семафоров имеет достойное отношение к барьерам, если вы хотите ее преследовать.
  • 0
    @ Дак это дает многоразовое барьерное решение. Я ищу обычное барьерное решение.
Теги:
semaphore
mutex
barrier

1 ответ

0

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

void workToDo()
{
    CMutex mutex(sharedLockingObject);

    // do your code
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню