【发布时间】: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