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

时间:2013-12-27 23:25:14

标签: multithreading perl sockets threadpool

我正在构建一个多线程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);
}

1 个答案:

答案 0 :(得分:0)

您获得的错误是因为$ tid未声明为共享变量。你需要分享深度&#39;这样不仅可以共享哈希,还可以共享密钥。