Multithreading 两个线程的协作

Multithreading 两个线程的协作,multithreading,perl,Multithreading,Perl,我创建了一个包含两个线程的Perl脚本: 1) 创建.cfg文件 2) 阅读那些.cfg文件 我想在一个线程忙于创建文件的同时,我的第二个线程将并排读取这些文件 但是当我的第二个线程被创建时,我面临一个问题,它将只读取在那个时刻创建的文件。谁能说出完成这项任务的想法 创建线程和读取文件功能如下所述: sub CreateThreads() { $threads[0] = threads->create( \&CreateCFG ); sleep 3; $th

我创建了一个包含两个线程的Perl脚本:

1) 创建
.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秒后开始,它应该开始读取文件。