Это определенно безопасно в однопоточной среде:
my @a = ^5;
for @a {
@a.push: $_ + 10 if $_ < 30
}
say @a
[1 2 3 4 11 12 13 14 21 22 23 24 31 32 33 34]
В многопоточной среде (что лучшеиспользовать в своей задаче) ничто не может быть воспринято как должное.Поэтому добавление нового элемента в массив лучше заключить в Lock
:
my @a = ^5;
my Lock $l .= new;
for @a {
start {
... # Do your work here
$l.protect: {
@a.push: $_ with $site
}
}
}
say @a
Обратите внимание, что последний пример не будет работать должным образом, поскольку все потоки start
ed должны быть await
Эд где-то внутри цикла.Считайте, что это просто базовая демонстрация.
Тем не менее, при любой возможности блокировки обычно избегают.Лучшее решение будет использовать блоки Channel
и react/whenever
.