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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кривые shared переменные в потоках, ОС Windows 
:(
    Опции темы
tolkien
Дата 9.7.2008, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Недавно писал приложение которое принимает запросы по сети, запускает параллельно процесс который делает кое что, после возвращается результат в главное приложение, а от туда отсылается ответ клиенту. ОC Windows. Знаю что в UNX у меня бы не было проблем, т.к порожденный процесс с помощью fork наследует все открытые манипуляторы файлов и все замечательно. Но в Windows наследуются только STDIN, STDOUT, STDERR. Решил сделать задачу с помощью потоков. Вычитал про shared переменные. Подумал "Ага вот это мне и надо". Но оказывает shared переменные в Windows( а может и нетолько не проверял) являются совсем не shared. Т.е в разных потоках они будут иметь свою копию(разный адрес в памяти). Соотвественно глобал указатель файлого манипулятора уже не передать в другой поток. И вобще никакой указатель не передать. Т.к это не shared, это банальное копирование значение из одного потока в другие, а не совместный доступ к общей переменной. Кроме того потоки жрут слишком много памяти источник http://www.perlmonks.org/index.pl?node_id=288022. Отсюда и кривой fork. 

Пока самое надежное, быстрое и простое решение по межпроцессорному взаимодействию.  Которое я встретил на Win это использование файлов или сокетов. Кроме того оно еще на 100% переносимо на другие платформы. 
PM MAIL   Вверх
AlexPet
Дата 9.7.2008, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хм. Да, если пометить переменную как shared, для нее не сделаешь метод open. 
Если не использовать shared, то в нить передадутся копии переменной. Однако вот такой простой пример отрабатывает корректно:
Код

use warnings;
use strict;
use threads;

open my $fh, '>', 'test.txt';

threads->new(\&pt, $_)->join for (1..2);

sub pt {
    my $i = shift;
        print $fh "This is thread number $i; filehadle is ".\$fh."\n";
}

close $fh;

Цитата

F:\Work\Perl>more test.txt
This is thread number 1; filehadle is REF(0x18977a8)
This is thread number 2; filehadle is REF(0x18e69c0)


PM MAIL ICQ Jabber   Вверх
KSURi
Дата 9.7.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



код не проверял...
Код

open my $fh, 'file' or die $!;
...
threads->create(\&worker, fileno $fh);
...
sub worker {
  my $fileno = shift;
  my $fh = IO::Handle::fdopen($fileno, 'r'); # можно еще попробовать open my $fh, '&', $fileno or die $!;
}


Добавлено через 3 минуты и 29 секунд
AlexPet, вообще врядли вы добьетесь того, что переменные в тредах имели один адрес в памяти, т.к. в перловом треде запускается новая копия интерпретатора

Это сообщение отредактировал(а) KSURi - 9.7.2008, 09:39


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


Шустрый
*


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

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



Цитата(KSURi @  9.7.2008,  09:39 Найти цитируемый пост)
AlexPet, вообще врядли вы добьетесь того, что переменные в тредах имели один адрес в памяти, т.к. в перловом треде запускается новая копия интерпретатора

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


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

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


 




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


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

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