gpt4 book ai didi

multithreading - 如何共享包含文件句柄的对象?

转载 作者:行者123 更新时间:2023-12-03 14:55:47 25 4
gpt4 key购买 nike

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";

文件句柄是否“共享”并不重要,它仅用于输出。也许有一个技巧可以将文件句柄存储在共享对象之外?

这个对象实际上包含在另一个共享对象中,另一个共享对象等等。具有讽刺意味的是,所讨论的对象从不使用线程本身,但如果用户使用线程,则必须在整个进程中保持协调。

有问题的真实代码 can be seen here :这些对象用于配置格式化输出的位置。一个对象是必需的,因为 output does not always go to a filehandle .

最佳答案

我目前无法访问线程 Perl,因此不能保证这会起作用。

但是有点简单的方法是使用抽象级别并将键/索引存储到对象中的全局文件句柄哈希/数组中,类似于以下内容:

my @filehandles = (); # Stores all the filehandles         ### CHANGED

my $stdout; # Store the index into @filehandles, NOT filehandle.
# Should really be renamed "$stdout_id" instead.

sub stdout {
my $self = shift;

return $stdout if defined $stdout;

$stdout = scalar(@filehandles); ### CHANGED
my $stdout_fh = $self->dup_filehandle(\*STDOUT); ### CHANGED
push @filehandles, $stdout_fh; ### CHANGED

$self->autoflush($stdout_fh); ### CHANGED
$self->autoflush(\*STDOUT);

return $stdout;
}

sub safe_print {
my $self = shift;
my $fh_id = shift; ### CHANGED
my $fh = $filehandles[$fh_id]; ### CHANGED

local( $\, $, ) = ( undef, '' );
print $fh @_;
}

我有一种强烈的感觉,你需要以某种方式对 ID 列表进行线程安全,所以也许需要一个共享索引计数器而不是 $stdout = scalar(@filehandles);

关于multithreading - 如何共享包含文件句柄的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8200159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com