Multithreading 两个线程的协作
我创建了一个包含两个线程的Perl脚本: 1) 创建Multithreading 两个线程的协作,multithreading,perl,Multithreading,Perl,我创建了一个包含两个线程的Perl脚本: 1) 创建.cfg文件 2) 阅读那些.cfg文件 我想在一个线程忙于创建文件的同时,我的第二个线程将并排读取这些文件 但是当我的第二个线程被创建时,我面临一个问题,它将只读取在那个时刻创建的文件。谁能说出完成这项任务的想法 创建线程和读取文件功能如下所述: sub CreateThreads() { $threads[0] = threads->create( \&CreateCFG ); sleep 3; $th
.cfg
文件2) 阅读那些
.cfg
文件
我想在一个线程忙于创建文件的同时,我的第二个线程将并排读取这些文件
但是当我的第二个线程被创建时,我面临一个问题,它将只读取在那个时刻创建的文件。谁能说出完成这项任务的想法
创建线程和读取文件功能如下所述:
sub CreateThreads() {
$threads[0] = threads->create( \&CreateCFG );
sleep 3;
$threads[1] = threads->create( \&ReadCFG );
}
sub ReadCFG() {
my $id = threads->tid();
opendir( DIR, $filedir ) or die $!;
while ( my $files = readdir(DIR) ) {
if ( $files eq "." || $files eq ".." ) {
next;
}
else {
my $filepath = $filedir . "/" . $files;
if ( $files =~ m/$probename/ ) {
my @file = split( "&", $files );
if ( $file[3] !~~ @reportrobots ) {
push( @reportrobots, $file[3] );
my $raddr =
"/" . $file[1] . "/" . $file[2] . "/" . $file[3];
&ProbeReport( \$userdata_file, \$filepath, \$raddr );
}
}
}
}
}
我想你这里的问题是你没有重读目录
opendir( DIR, $filedir ) or die $!;
while ( my $files = readdir(DIR) ) {
因为这并不明显,所以实际发生的是您第一次调用readdir
时,它读取目录,随后的调用只是迭代该列表
这是为了防止奇怪的事情发生,例如,如果我在循环中的那个目录中创建一个文件
所以实际上,您的第二个线程只会查看该目录一次。其功能类似于:
my @files = readdir(DIR);
foreach my $file ( @files ) {
我建议您需要的是功能。或者使用
Thread::Queue
或其他机制来传递需要处理的文件 为什么不将两个线程合并成一个具有两个功能的线程:首先创建文件,然后读取它?回答这个问题需要更多的细节。然而,我怀疑问题在于,您假设的是共享变量,而不是。实际上,正在创建的CFG文件是从源获取的,并且该文件的内容写入该文件中。我希望第一个线程应该继续创建文件,因为将有大量的文件创建约300-400,我希望第二个线程应该在2-3秒后开始,它应该开始读取文件。