#multithreading #job-scheduling #thread-synchronization
Вопрос:
Требуется ли для следующего какая-то синхронизация?
Контроль | Рабочий 1 | Работник 2 | … | Работник n |
---|---|---|---|---|
Проверьте, все ли a_n верно. Если да, отправьте новое задание. В противном случае попробуйте еще раз. | когда закончите: установите для a_1 значение true | когда закончите: установите для a_2 значение true | … | когда закончите: установите a_n в значение true |
Тест, выполняемый управляющим потоком, не является атомарным. Однако значение a_n никогда не может быть установлено в значение false. Таким образом, гарантируется, что все a_n будет истинным для некоторой итерации в потоке управления. По-прежнему ли необходима синхронизация?
Этот поток управления используется для обработки заданий в виде графика. Все задачи хранятся в связанном списке. Если все $a_{kn}$ истинны, задание $k$ отправляется и удаляется из списка. Если это не так, попробуйте $a_{k 1}$. Когда будет достигнут конец списка, начните с начала списка. Продолжайте, пока список не опустеет.
Примечание: Я предполагаю, что график представляет собой DAG.
Комментарии:
1. Если поток управления считывает переменную
a_n
и не запрашивается синхронизация, то он может кэшировать значение переменной столько, сколько захочет. Когда рабочий поток изменит переменную на true, управляющий поток может никогда не увидеть это изменение.2. В Java было бы достаточно пометить
a_n
переменную какvolatile
(или использоватьAtomicBoolean
)3. @AlexanderPavlov Но атомарного должно быть достаточно
4. для вашей задачи достаточно даже изменчивости.
AtomicBoolean
просто предоставляет дополнительные удобные методы