Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Область видимости переменных и потоки 
:(
    Опции темы
MrCleric
Дата 10.1.2008, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.1.2008

Репутация: нет
Всего: нет



Господа форумчане, помогите решить такую задачку... есть скрипт

Код

use strict;
use threads;
require 'sub.pl';

my($i,$ref);

$i='var';

#$ref = threads->new(\&th);

th();

<STDIN>;


и соответственно sub.pl

Код

sub th(){
    print '1';
    print $main::i;
}
1


суть проблемы в том, что результатом работы скрипта оказывается "1", а не "1var", как ожидается. В чем дело? Это я к вечеру туплю или что-то в перле поменялось? Я сейчас использую ActivePerl 5.8.6 .
Конечная цель - увидеть глобальную переменную из функции, входящей в подключаемый файл и отправляемой в поток.
PM MAIL   Вверх
KSURi
Дата 11.1.2008, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 5
Всего: 27



t.pl:
Код

#!perl

use strict;
use threads;
require 'sub.pl';
our $i = 'var';
th();
<STDIN>;


sub.pl:
Код

#!perl

sub th(){
    print '1';
    print $i;
}
1


Код

D:\>t.pl
1var

D:\>


perldoc -f our


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
MrCleric
Дата 11.1.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.1.2008

Репутация: нет
Всего: нет



Ну допустим. А как насчет такого кода:

Код

use strict;
use threads;
require 'sub.pl';

my($ref);
our($i);

$i=1;

$ref = threads->new(\&th);

th();

<STDIN>;


sub.pl

Код

sub th(){
    while(1){
        print $i++;
        print "\n";
        sleep(1);
    }
}
1


По сути одна и та же функция, работающая о основном потоке и потоке-потомке используют одну и ту же глобальную переменную. Вместо этого, похоже, функция, работающая в потоке создала для себя копию этой переменной и работает с ней. Ожидается результат работы кода: "1 2 3 4", а вмест этого я получаю "1 1 2 2". В чем проблема?
PM MAIL   Вверх
sir_nuf_nuf
  Дата 11.1.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: нет
Всего: 31



в новых версиях perl ( > 5.6 ) даже глобальные переменные не разделяются между потоками.
читаем сюда
http://perldoc.perl.org/threads.html
а потом сюда
http://perldoc.perl.org/threads/shared.html

а потом переписываем скрипт примерно  так
Код

use strict;
use threads;
use threads::shared; # here new module

require 'sub.pl';

my($ref);

our $i : shared;  # here new attribute!!

$i=1;
$ref = threads->new(\&th);
th();
<STDIN>;


работает как 1 2 3 


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.