【问题标题】:Unable to share sockets among threads perl无法在线程之间共享套接字perl
【发布时间】:2014-01-15 13:09:54
【问题描述】:

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

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);
}

【问题讨论】:

  • 您在哪个平台上运行此脚本? (Windows、Linux 还是其他?)
  • Linux 是我的平台@duskwuff
  • 可以共享socket的fileno()。我建议不要为您的任务使用线程。试试 AnyEvent 或 Coro,这将消除共享问题。

标签: multithreading perl sockets threadpool


【解决方案1】:

您遇到的错误是因为 $tid 未声明为共享变量。您需要共享“深度”,以便不仅共享散列,而且还共享其密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多