Forum Webscript.Ru

Программирование => Perl => Тема начата: darkyn от 11 Октября 2006, 16:17:26

Название: потоки, и shared хеши
Отправлено: darkyn от 11 Октября 2006, 16:17:26
появилась необходимость хранить множество информации о каждом работающем потоке в общем хеше.

что бы было понятней сразу часть кода:
my %MODULES :shared = () ;

потом в определенный момент хеш заполняется параметрами
$MODULES{$mod_name} = (
   \'subs\' => {constructor=>\'\',destructor=>\'\',entrypoint=>\'\'},
   \'info\' => {}, \'messages\' => [] );

здесь-то и появляется ошибка "Invalid value for shared scalar" =(
это какие-то ограничения на shared переменные?
как правильно реализовать наполнение хеша $MODULES?
Название: потоки, и shared хеши
Отправлено: arto от 11 Октября 2006, 16:47:57
$MODULES{$mod_name} ={ ... } ?
Название: потоки, и shared хеши
Отправлено: darkyn от 11 Октября 2006, 17:25:49
ошибся со скобками в первом посте. у меня в коде так и прописано. вот только пока хеш %MODULES не является shared всё нормально присваевается, когда объявлю его как :shared сразу начинает ругаться той же ошибкой "Invalid value for shared scalar"

сделал маленький тест:

#!/usr/bin/perl -w

use strict;
use Data::Dumper;
use threads;
use threads::shared;

my %MODULES :shared = () ;

my $name = \'test_key\';
$MODULES{$name } = {
     \'subs\' => {c=>\'\',d=>\'\',e=>\'\'},
     \'info\' => {},
     \'messages\' => [] };

print "\\r\\n";
print Dumper(\\%MODULES);
print "\\r\\n";

как же всё это заставить работать?) и в чём именно проблема?)
Название: потоки, и shared хеши
Отправлено: ondr от 11 Октября 2006, 22:44:20
from perldoc threads::shared

---
The only values that can be assigned to a shared scalar are other scalar values, or shared refs:

  my $var :shared;
  $var = 1;              # ok
  $var = [];             # error
  $var = &share([]);     # ok
Название: потоки, и shared хеши
Отправлено: darkyn от 12 Октября 2006, 12:10:18
вот так всегда. спешишь, спешишь... а всё лечит rtfm ; )
Название: потоки, и shared хеши
Отправлено: darkyn от 13 Октября 2006, 11:33:48
немного продолжая тему:

при попытке:
...
$constructor = \\&some_function ;
$MODULES{$name}{subs}{constructor} = $constructor ;
...
^^^ вылетает с ошибкой \'Invalid value for shared scalar\'

[?]  возможно ли это? и каким образом можно положить в shared переменную ссылку на функцию?