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

Это вопрос интервью: установить барьер между 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;
};

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

1 ответ

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

void workToDo()
{
    CMutex mutex(sharedLockingObject);

    // do your code
}

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

Другие вопросы по тегам