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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки в классах 
:(
    Опции темы
bvn13
Дата 9.2.2012, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Уважаемые форумчане!
Подскажите, в какую сторону мне копнуть по моей проблеме, пожалуйста!

написал тестовый пример:
Код

package Test;

use strict;
use warnings;

use threads;
use threads::shared;


sub new
{
    my $self = {
        'data' => 0,
        'threads' => []
    };

    return bless $self;
}


sub start
{
    my $self = shift;
    
    my @p = ($self);
    $self->{'threads'}->[scalar @{$self->{'threads'}}] = threads->create(\&checkThread, @p);
    @p = ();
    undef @p;
    
    for (my $i=0; $i<5; $i++) {
        @p = ($self, $i);
        $self->{'threads'}->[scalar @{$self->{'threads'}}] = threads->create(\&myThread, @p);
        @p = ();
        undef @p;
    }
    
    foreach my $th (@{$self->{'threads'}}) {
        $th->join;
    }
}


sub myThread
{
    my $self = shift;
    my $num = shift;
    sleep 1;
    $self->{'data'}++;
    print "THREAD_${num}: $self->{'data'}\n";
}

sub checkThread
{
    my $self = shift;
    for (my $i=0; $i<5; $i++) {
        print "CHECK: $self->{'data'}\n";
        sleep 1;
    }
}

1;


my $test = Test->new;
$test->start;



вот вывод:
Код

CHECK: 0
CHECK: 0
THREAD_0: 1
THREAD_1: 1
THREAD_2: 1
THREAD_3: 1
THREAD_4: 1
CHECK: 0
CHECK: 0
CHECK: 0


Как вы видите, я передаю в каждый поток, представленный методом класса переменную (ссылку на хеш) $self. Но почему-то даже по ссылке внутри потока получаю копию объекта класса. 
Как побороть эту фичу?
PM MAIL   Вверх
Pfailed
Дата 9.2.2012, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



http://search.cpan.org/~jdhedden/threads-s...ared.pm#OBJECTS
Код

package Test;

use strict;
use warnings;
use threads;
use threads::shared;

sub new
{
    my $self :shared = shared_clone({
        'data' => 0,
        'threads' => []
    });
    
    bless $self, shift;
}

sub start
{
    my $self = shift;
    
    my @p = ($self);
    $self->{'threads'}->[scalar @{$self->{'threads'}}] = shared_clone(threads->create(\&checkThread, @p));
    @p = ();
    undef @p;
    
    for (my $i=0; $i<5; $i++) {
        @p = ($self, $i);
        $self->{'threads'}->[scalar @{$self->{'threads'}}] = shared_clone(threads->create(\&myThread, @p));
        @p = ();
        undef @p;
    }
    
    foreach my $th (@{$self->{'threads'}}) {
        $th->join;
    }
}
sub myThread
{
    my $self = shift;
    my $num = shift;
    sleep 1;
    $self->{'data'}++;
    print "THREAD_${num}: $self->{'data'}\n";
}
sub checkThread
{
    my $self = shift;
    for (my $i=0; $i<5; $i++) {
        print "CHECK: $self->{'data'}\n";
        sleep 1;
    }
}
1;

my $test = Test->new;
$test->start;




--------------------
PM MAIL   Вверх
bvn13
Дата 11.2.2012, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо! Это действительно работает! smile

Теперь другая проблема. Как сделать статическую переменную в классе, которая бы была едина между потоками?
Опять надо делать shared_clone() ? А мне в эту переменную (ссылка на массив) надо запихивать ссылки на Rose:smileB::Object-ы для последующей записи в одном из потоков... А Роза не переносит потоки. Программа падает, если я пытаюсь расшарить объекты Розы... Как быть в этом случае?
PM MAIL   Вверх
DurRandir
Дата 12.2.2012, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а) Не использовать потоки
б) Работать с этим объектом из одного выделенного потока

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


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

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


 




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


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

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