Барьерная реализация с использованием mutex & amp; семафор

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

Решение

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

void workToDo()
{
CMutex mutex(sharedLockingObject);

// do your code
}

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]