Перловые потоки не поддерживают совместное использование файлов. Все элементы общей структуры данных должны совместно использоваться. Это создает проблему, если нужно обмениваться объектом, который содержит дескриптор файла.
{
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";
На самом деле не имеет значения, является ли дескриптор файла "общим" или нет, он используется только для вывода. Возможно, есть трюк, когда дескриптор файла хранится вне общего объекта?
Этот объект фактически содержится в другом общем объекте, который находится в другом и так далее. Великая ирония - объекты, о которых идет речь, никогда не используют сами потоки, но должны оставаться согласованными в процессе, если пользователь использует потоки.
Настоящий код, о котором идет речь можно увидеть здесь: эти объекты используются для настройки выхода форматированного вывода. Объект необходим, потому что вывод не всегда идет в дескриптор файла.