我正在尝试创建一个可以在线程之间共享的套接字对象。以下代码不起作用,因为套接字对象是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);
}
错误:不支持的ref类型:行中的GLOB(此处为7,调用shared_clone的地方)。
答案 0 :(得分:2)
我可以建议您不尝试在线程之间共享套接字吗?这感觉就像要求他们之间的并发问题。
虽然有(可能)方法可以做到这一点,但我建议 - 让一个线程“负责”IO,并使用Thread::Queue
之类的东西与之交互。
E.g。类似的东西:
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机制可以使用。
否则我很想建议使用分叉(在Unix上)通常更有效。