Вопрос
Безопасно ли нескольким потокам извлекать и хранить простые отдельные значения в общем хэше без lock()
хэша?
Можете ли вы доказать это или привести сильный авторитет?
Фон
Я считал, что в худшем случае манипуляции с открытым хешем могут привести к ошибкам в сегменте.
Однако я недавно видел код, который координирует работу рабочих потоков таким образом, который автор считает безопасным. Код, о котором идет речь, выполняет только простые извлечения и сохранения:
- Общий хеш - это простой общий хеш (не определяется пользователем, конструкция tie () d)
- Значения являются простыми скалярами, а не ссылками и не являются общими для всех
- Каждая пара ключ / значение уникально сохраняется и изменяется одним и только одним потоком
- Все пары ключ / значение могут быть получены любым потоком
- Нет потока, повторяющего общий хеш (без
each()
, без keys()
или values()
зацикливания)
Выдержка из кода
my %status : shared;
for my $id (1 .. $n) {
threads->create(\&thread_routine);
}
sub thread_routine {
my $me = threads->tid();
$status{ $me } = 'Getting ready';
... do something ...
$status{ $me } = 'Thinking';
... do something else ...
$status{ $me } = 'Looking around';
for my $tid (threads->list) {
next if $tid == $me;
if ($status{ $tid } eq "Thinking") { ... react ... }
...
}
$status{ $me } = 'All done';
}