Как поделиться объект, содержащий дескриптор файла?

Потоки Perl не поддерживают совместное использование дескрипторов файлов. Все элементы общей структуры данных должны быть общими. Это представляет проблему, если нужно совместно использовать объект, содержащий дескриптор файла.

{
    package Foo;
    use Mouse;

    has fh =>
      is      => 'rw',
      default => sub { \*STDOUT };
}

use threads;
use threads::shared;
my $obj = Foo->new;
$obj = shared_clone($obj);           # error: "Unsupported ref type: GLOB"
print {$obj->fh} "Hello, world!\n";

На самом деле не имеет значения, является ли дескриптор файла «совместно используемым» или нет, он используется только для вывода. Может быть, есть уловка, при которой дескриптор файла хранится вне общего объекта?

Этот объект фактически содержится в другом разделяемом объекте, который находится в другом и так далее. Великая ирония состоит в том, что рассматриваемые объекты никогда не используют сами потоки, но должны оставаться скоординированными в процессе, если пользователь использует потоки.

Настоящий рассматриваемый код можно увидеть здесь : Эти объекты используются для настройки того, куда идет форматированный вывод. Объект необходим, потому что вывод не всегда попадает в дескриптор файла .

16
задан Schwern 20 November 2011 в 07:49
поделиться