无法在perl线程之间共享套接字



我正在构建一个多线程perl-TCP服务器,它使用不同的线程来处理不同的客户端。为此,我维护了一个线程池,用于跟踪线程是空闲还是工作
在主线程中,我打开一个侦听套接字,并使用绑定到特定端口

$socket = new IO::Socket::INET(Localhost => '127.0.0.1', 
LocalPort => '5000', 
Proto => 'tcp', 
Listen => $MAX_THREADS, Reuse => 1) or die "Error in Socket Creation:  $!n";

主线程还使用socket->accept()侦听任何传入连接,如果成功,则将此返回套接字传递给处理它的子线程,并向套接字对应的客户端发送确认。然而,我无法通过这个插座。

我在谷歌上搜索了一下,但运气不好,后来我决定维护一个传入套接字的全局哈希图,子线程稍后可以访问该哈希图(哈希图是共享的),然后进行处理。

然而,perl给了我一个关于共享标量的无效值的错误。这是代码位:

$sochandler->{$tid} = $socket->accept(); 
#$sochandler is the shared global hashmap with keys as thread IDs

附言:我是perl的新手,我已经尽力解释我的问题

下面是每个子线程运行的子程序代码:

sub worker
{
my ($work_q) = @_;
my $tid = threads->tid();
do {
printf("Idle     -> %2dn", $tid);
$IDLE_QUEUE->enqueue($tid);
my $work_tid = $work_q->dequeue();
my $work = $sochandler->{$work_tid};
last if ($work_tid < 0);
printf("            %2d <- Workingn", $tid);
while (($work_tid > 0) && ! $TERM) {
print "Accepted New Client Connection From: $work->peerhost(), $work->peerport()n";
my $data = "ACK from server";
$work->send($data);
$work->recv($data,1024);
print "Received from Client : $datan"; 
}
} while (! $TERM);
printf("Finished -> %2dn", $tid);
}

您得到的错误是因为$tid没有声明为共享变量。您需要共享"deep",这样不仅可以共享哈希,还可以共享其密钥。

最新更新