многопоточность — синхронизируйте n потоков только с использованием семафора и / или мьютекса в переполнении стека

Мы готовимся к тесту на следующей неделе, и нам дали упражнение от нашего учителя, и мы просто не видим решения:

Как синхронизировать n темы, так что все n потоки ожидают в определенном месте и продолжают свою «работу» вместе, когда все n темы достигли этого места?

Нам разрешено использовать конструкции Mutex и Semaphore. Решение должно быть простым, но мы просто не можем найти ответ.

-3

Решение

Вот большой намек. Вам нужно 2 семафора, оба с N флаги. Вы можете решить эту проблему с помощью дополнительной темы. Ключ в том, что вы можете позвонить down() на семафоре несколько раз. например Если вы позвоните down() на семафор 8 раз, нужно все 8 up()прежде чем вы сможете продолжить.

// an additional thread (not one of the N)
void trigger(Semaphore* workersCollect, Semaphore* workersRelease, int n)
{
while(true)
{
for (int i = 0; i < n; ++i)
workersCollect->down();

for (int i = 0; i < n; ++i)
workersRelease->up();
}
}

// Prototype for the "checkpoint" function (exercise for the reader)
void await(Semaphore* workersCollect, Semaphore* workersRelease);

Вы также можете решить эту проблему без лишнего потока, используя более сложную проверку состояния.

Этот дизайн имеет недостаток. Если работник завершает свою работу очень быстро, он может получить более одной задачи (в то время как другой поток вообще не работает). Это хорошо, если у вас дизайн типа пула потоков, но плохо, если, скажем, каждый поток должен работать над своим отдельным разделом набора данных.

Чтобы это исправить, вам нужен семафор на поток. Что-то похожее на

Semaphore workerRelease[N];

но будьте осторожны, чтобы избежать ложного обмена. (Вам не нужно больше 1 семафора в строке кэша.)

0

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

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

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