gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:55:43 25 4
gpt4 key购买 nike

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

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

最佳答案

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

关于multithreading - 无法在线程之间共享套接字perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20809213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com