Имеет ли это смысл?
Да - каждая задача знает свои предварительные условия и ожидает их выполнения перед выполнением.Это один из множества допустимых дизайнов, хотя вам может быть сложно масштабировать его по мере увеличения количества задач и усложнения их взаимозависимостей.
Нужны ли здесь какие-либо блокировки на флажках?
Да.Флаги должны быть shared , чтобы один поток мог ими манипулировать, а другой видел их, а для безопасного использования общие переменные должны быть lock()
ed.
IsИспользование таких циклов в то время как общие?- в голову приходит термин «ожидание занято»
К сожалению, да, но Не делайте этого, пожалуйста. Общие переменные в perl могут служить условными переменными через которые потоки могут отправлять уведомления друг другу:
sub func1 {
{
lock(%shared_state);
until ($shared_state{ "func2 done" } and $shared_state{ "func3 done" }) {
cond_wait(%shared_state);
}
}
# do work -- note that %shared_state is unlocked
# now tell others that we're done
lock(%shared_state);
$shared_state{ "func1 done" } = 1;
cond_broadcast(%shared_state);
# %shared_state will be unlocked, and broadcast delivered when we leave this scope
}
Когда вы cond_wait
, переменная общего доступа разблокируется, и ваш поток переходит в спящий режим.Нет необходимости в занятом цикле.
Есть ли более стандартное решение для этого?
$thr->join
, поскольку Синан предлагает , это простои естественный способ дождаться окончания работы определенного потока. Thread :: Semaphore может выполнять аналогичную, но более сложную функцию (и, что полезно, может быть инициализирован до значений меньше нуля).Обычная необходимость «дождаться окончания этих 5 потоков» может быть достигнута с помощью Thread :: Barrier .TMTOWTDI.