首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个线程的协作

两个线程的协作
EN

Stack Overflow用户
提问于 2015-06-30 15:40:48
回答 1查看 24关注 0票数 0

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

1)创建.cfg文件

2)读取这些.cfg文件

我希望在一个线程忙于制作文件的同时,让我的第二个线程同时读取这些文件。

但是我正面临着一个问题,当我的第二个线程被创建时,它将只读取在那个时刻创建的文件。有人能给出完成这项任务的想法吗?

创建线程和读取文件功能如下:

代码语言:javascript
复制
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 );
                }

            }
        }

    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-07-09 20:39:04

我认为您在这里的问题将是您没有重新读取目录。

代码语言:javascript
复制
opendir( DIR, $filedir ) or die $!;
while ( my $files = readdir(DIR) ) {

因为这并不明显,所以实际发生的情况是,您第一次调用readdir时,它会读取目录,而随后的调用只是迭代该列表。

这是为了防止发生奇怪的事情,例如,我在循环中的那个目录中创建了一个文件。

因此,实际上,你的第二个线程只会查看该目录一次。它的功能类似于:

代码语言:javascript
复制
my @files = readdir(DIR); 
foreach my $file ( @files ) {

我建议您需要的是rewinddir函数。或者可能使用Thread::Queue或其他机制来传递需要处理的文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31132364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档