mitaichik
@mitaichik

Как заставить несколько потоков подождать?

Всем привет. Есть несколько потоков. В некоторых местах их нужно останавливать по событию из, скажем так, управляющего потока, чтоб они ждали другого события. Как такое сделать?

Вот примерный код:

Рабочий поток:

doAny1();
doAny2();

lock.awaitIfLocked();

doAny3();
doAny4();

lock.awaitIfLocked();

...


Управляющий поток:

lock.lock();

doAny();

lock.unlock();


Нужно чтоб после вызова lock.lock() все рабочие потоки останавились в местах lock.awaitIfLocked() и продолжили работы после lock.unlock()

Заранее спасибо!
  • Вопрос задан
  • 183 просмотра
Пригласить эксперта
Ответы на вопрос 2
@nirvimel
Это можно реализовать через ReentrantReadWriteLock. Управляющий поток захватывает writeLock, а рабочие потоки в точке остановки захватывают readLock (на время какого-то действия, наверное). Они могут захватить readLock все одновременно, но только, если writeLock не захвачен.

Вообще не знаю зачем вам просто останавливать потоки. Обычно возникает потребность останавливать потоки перед выполнением какого-то действия, которое должно быть защищено. Если у вас просто остановка без защиты следующего за ней действия, то представьте такой вариант:
1. Блокировка свободна.
2. Рабочий поток перепрыгивает точку остановки.
3. Сразу после этого ОС переключает управление на управляющий поток.
4. Управляющий поток захватывает блокировку.
5. ОС переключает управление обратно на рабочий поток.
6. Рабочий поток выполняет код за точкой остановки (блокировка при этом захвачена в управляющем потоке).
Теперь скажите чем этот результат отличается от того, как если бы рабочий поток просто перепрыгнул бы точку остановки при захваченной блокировке?
Ответ написан
Комментировать
Therapyx
@Therapyx
Data Science
В идеале почитай про Mutex/Semaphore.
Не в идеале, сделай нужные стрейты для этих потоков. К примеру декларируешь n-ное кол-во булеан переменных, которые будут сложить блокировкой того или иного или всех потоков. Ну и обычным ветвлением проверяешь этот Lock/unlock
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы