我正在构建一个多线程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()侦听任何传入连接,如果成功将此返回套接字传递给处理它的子线程,并向对应于套接字的客户端发送确认。但是,我无法通过此套接字。
我google了一下,没有运气,后来我决定维护一个传入套接字的全局哈希映射,以后可以由子线程访问(哈希映射是共享的),然后处理它。
但是perl给出了一个关于共享标量的无效值的错误。这是代码位:
$sochandler->{$tid} = $socket->accept();
#$sochandler is the shared global hashmap with keys as thread IDs
PS:我是perl的新手,我试图尽可能多地解释我的问题
以下是每个子线程运行的子程序代码:
sub worker
{
my ($work_q) = @_;
my $tid = threads->tid();
do {
printf("Idle -> %2d\n", $tid);
$IDLE_QUEUE->enqueue($tid);
my $work_tid = $work_q->dequeue();
my $work = $sochandler->{$work_tid};
last if ($work_tid < 0);
printf(" %2d <- Working\n", $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 : $data\n";
}
} while (! $TERM);
printf("Finished -> %2d\n", $tid);
}
答案 0 :(得分:0)
您获得的错误是因为$ tid未声明为共享变量。你需要分享深度&#39;这样不仅可以共享哈希,还可以共享密钥。