Я пытаюсь написать простой скрипт, который использует потоки и разделяет переменную, но я не хочу превращать эту переменную глобальную в весь скрипт. Ниже приведен упрощенный пример.Совместное использование переменной потока без ее глобального (Perl)
use strict;
use warnings;
use threads;
use threads::shared;
my $val:shared;
# Create threads
for my $i (1 .. 5) {
threads->create(\&do_something, $i);
}
# Wait for all threads to complete
map { $_->join(); } threads->list();
# $val is global to the script so this line will work!
print "VAL IS: $val\n";
sub do_something {
my $i = shift;
print "Doing something with thread $i!\n";
{
lock $val;
$val = "SOMETHING IS $i";
print "$val\n\n";
}
}
Выход:
Делая какие-нибудь с резьбой 1! SOMETHING IS 1
Выполнение чего-либо с резьбой 2! SOMETHING IS 2
Выполнение чего-либо с резьбой 3! SOMETHING IS 3
Выполнение чего-либо с резьбой 4! SOMETHING IS 4
Выполнение чего-либо с резьбой 5! ЧТО-ТО ЕСТЬ 5
VAL IS: Что-то 5
Как я могу получить этот эффект, не делая $val
доступным для всего сценария? Другими словами, как я могу это сделать, поэтому попытка печати VAL IS: $val
завершится с ошибкой, но переменная по-прежнему будет успешно разделяться потоками?
Я не могу определить это так:
# Create threads
for my $i (1 .. 5) {
my $val:shared;
threads->create(\&do_something, $i);
}
Или получите:
Глобальный символ "$ Вэл" требует явного пакета
Каков правильный способ лексической реализации общей переменной?
Если вы не проходя его, как мог нить как совместно (глобальный), а не глобальный? Кажется, что вы хотите создать слой для своей области. Также вы пытались использовать 'our ($ val);'? – vol7ron
Side-note, 'map {$ _-> join(); } threads-> list(); '=>' $ _-> join() для threads-> list(); 'чтобы ваши намерения были четкими. –
@ Сухой27, спасибо, это немного яснее. – tjwrona1992