gpt4 book ai didi

multithreading - Perl线程之间的共享套接字对象

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

我正在尝试创建一个可以在线程之间共享的套接字对象。由于套接字对象是GLOB,因此以下代码不起作用。套接字对象如何共享?可以这样吗?

my $socket1 = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => "localhost",
PeerPort => "888",
) or die "couldn't connect: $!";

my $socket_shared =shared_clone($socket1);
....
my $thr1 = threads->create(\&Thread_1);

$thr1->join();

sub Thread_1 {

lock($socket_cpy);

my $data = "Msg.\n";
$socket1->send($data);
$socket1->recv($data,1024);

}

错误:不支持的引用类型:第7行的GLOB(此处为7,调用了shared_clone)。

最佳答案

我是否可以建议您不要尝试在线程之间共享套接字?感觉像是在要求它们之间存在并发问题。

尽管有(可能)执行此操作的方法,但我建议使用-对IO具有“负责”的单个线程,并使用Thread::Queue之类的东西与之交互。

例如。就像是:

use strict;
use warnings;

use threads;
use Thread::Queue;
my $output_q = Thread::Queue->new();

my $nthreads = 1;

sub socket_thread {

my $socket1 = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => "localhost",
PeerPort => "888",
) or die "couldn't connect: $!";

while ( my $data = $output_q->dequeue() ) {
$socket1->send($data);
$socket1->recv( $data, 1024 );
}
}


sub worker_thread {
$output_q->enqueue( "Some text from thread: ",
threads->self->tid(), "\n" );
}

for ( 1 .. $nthreads ) {
threads->create( \&worker_thread );
}

foreach my $thr ( threads->list() ) {
$thr->join();
}

这样一来,您根本不需要传递套接字,就可以使用一个或多个队列来序列化您的IO。我认为,这是首先插入perl的更强理由之一-您可以使用更好的IPC机制。

否则,我会建议使用 fork ,这通常会更有效(在Unix上)。

关于multithreading - Perl线程之间的共享套接字对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26852180/

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