【发布时间】:2014-11-14 06:12:56
【问题描述】:
我有一个模块正在运行多个线程并将它们推送到线程列表中。
例如:
#!/usr/bin/perl
#test_module.pm
package test_module;
use strict;
use warnings;
use threads;
sub main {
my $max_threads = 10;
my @threads = ();
# create threads
while (scalar @threads < $max_threads) {
my $thread = threads->new(\&thread_sub);
push @threads, $thread;
}
# join threads
for my $thread (@threads) {
$thread->join();
}
}
sub thread_sub {
my $id = threads->tid();
print "I am in thread $id\n";
}
1;
问题是我从一个 Perl 脚本多次调用这个模块,而不是消除旧线程并创建新线程,线程 ID 只是不断增加。我听说如果你没有正确地摆脱 Perl 中的旧线程,这会导致内存泄漏并减慢你的程序,这是真的吗?我的旧线程中的数据是否只是在内存中占用空间?
如果是这样,这可能会成为一个大问题,因为我的脚本将成为一个更大的程序的一部分,该程序可能会生成数百或数千个线程,所有这些线程即使在使用完之后也会占用内存。我怎样才能阻止这种情况发生?我的线程可以重复使用吗?
这是一个示例脚本,它将调用模块并显示线程将如何继续增加,即使我加入了旧线程(我认为“加入”是你在它们之后清理的方式,我做错了什么吗? ) 这个脚本的使用方式我无法承受旧线程的内存占用空间。
例如:
#!/usr/bin/perl
#testing.pl
use strict;
use warnings;
use test_module;
test_module::main();
test_module::main();
test_module::main();
system 'pause';
谢谢!
【问题讨论】:
-
为什么要重用线程ID?
-
我想我真正想知道的是所有线程内存是否真的在“加入”时释放。 id 不断增加的事实使得旧线程似乎仍然存在于内存中,即使它们已经“加入”了。
-
线程 id 递增与进程 id 递增一样是一个红鲱鱼。两者都不意味着正在发生耗尽。
标签: multithreading perl thread-safety threadpool