2013-08-24 62 views
1

我試圖用perl(Windows x64)編寫多線程服務器。當試圖從另一臺計算機連接到它時,即使我一次只保留一個連接,我發現內存和句柄的使用量也在不斷增加。經過數千次試用後,它幾乎消耗了所有的系統內存。我無法弄清楚原因。perl服務器內存泄漏

下面是服務器端:

use IO::Socket::INET; 
use threads; 

sub session_thread 
{ 
    my $client_socket=$_[0]; 

    my $client_address = $client_socket->peerhost(); 
    my $client_port = $client_socket->peerport(); 
    print "connection from $client_address:$client_port\n"; 

    my $data = ""; 
    $client_socket->recv($data, 1024); 
    print "$client_address:$client_port says: $data"; 

    $data = "ok"; 
    $client_socket->send($data); 

    shutdown($client_socket, 1); 
    $client_socket->close(); 
    threads->exit(); 
} 

$| = 1; 

my $socket = new IO::Socket::INET (
    LocalHost => '0.0.0.0', 
    LocalPort => '7777', 
    Proto => 'tcp', 
    Listen => 5, 
    ReuseAddr => 1 
); 
die "cannot create socket $!\n" unless $socket; 
print "server waiting for client connection on port 7777\n"; 

while(1) 
{ 
    my $client_socket = $socket->accept(); 
    threads->create('session_thread',$client_socket); 
} 

$socket->close(); 

感謝。

回答

6

您必須等待線程完成joining it或者告訴Perl您不關心線程的返回值,並且在線程退出後Perl本身應該清理數據。後者似乎與您的使用案例相匹配,並由detaching完成。

另請注意,在您的示例中使用exitnot necessary。您可以簡單地從線程的子例程中正常返回。 exit用於結束程序中更深嵌套級別的線程。

+0

分離正是我想要的。非常感謝你! – babel92