Multithreading Perl线程无法正确打印

Multithreading Perl线程无法正确打印,multithreading,perl,file-io,printing,Multithreading,Perl,File Io,Printing,如果在另一篇文章中有明确的例子,请让我知道。我的线程有交错打印问题。我试图通过在所有线程中使用共享变量来控制我的线程。下面的伪代码突出显示了给我带来问题的代码片段。我尽了一切努力让线程等待轮到打印。目前只有几条输出线被破坏 #!/usr/bin/perl

如果在另一篇文章中有明确的例子,请让我知道。我的线程有交错打印问题。我试图通过在所有线程中使用共享变量来控制我的线程。下面的伪代码突出显示了给我带来问题的代码片段。我尽了一切努力让线程等待轮到打印。目前只有几条输出线被破坏

#!/usr/bin/perl                                                                                                                                
use threads;
use threads::shared;

my $PRINTFLAG :shared = 1;

Run_Threads();

sub Do_stuff{

    lock($PRINTFLAG);
    cond_wait($PRINTFLAG) until $PRINTFLAG == 1;
    $PRINTFLAG = 0;
    print "$working\n";
    $PRINTFLAG =1;
}
Sub以生成线程

sub Run_Threads{

    my @threads;

    for (my $i = 1; $i <= 5; $i++){
        push @threads, threads->create(\&Do_stuff);
    }

    foreach (@threads){
        $_->join;
    }
}
子运行线程{
我的@threads;
对于(我的$i=1;$i创建(\&Do\u stuff);
}
foreach(@threads){
$加入;
}
}

似乎每个线程都有自己的句柄,因此也有自己的输出缓冲区。考虑到中的机制无法共享Perl文件句柄,这并不奇怪

这意味着您需要在释放锁之前刷新句柄的缓冲区。您可以显式执行此操作:

select->flush();       # Flush handle currently default for print.
或者,您可以在每次打印到该句柄后让perl自动刷新:

select->autoflush(1);  # Autoflush handle currently default for print.
$| = 1;                # Autoflush handle currently default for print.
注意:要在Perl 5.14之前使用
->flush
->autoflush
方法(但不适用于
$|=1;
),还需要加载


顺便说一下

my $PRINTFLAG :shared = 1;
lock($PRINTFLAG);
cond_wait($PRINTFLAG) until $PRINTFLAG == 1;
$PRINTFLAG = 0;
print "$d\n";
$PRINTFLAG =1;
可以简化为

my $PRINTMUTEX :shared;
lock($PRINTMUTEX);
print "$d\n";

根据我对线程的经验,它使用起来更好/更简单

我有两个队列:一个用于运行线程的任务,另一个用于线程的结果


因此,在我的主线程中,我只需检查结果的队列并从中打印。因此,在访问结果文件等时没有任何冲突。

$PRINTFLAG不是一个文件句柄。我只是试图在一个线程完成打印到标准输出时使用它来暂停线程。我需要打印到文件句柄吗?内部缓冲是否使我出错?我应该设置缓冲吗r到零?@zev.kronenberg,Re“$PRINTFLAG不是一个文件句柄”,我知道。@zev.kronenberg,Re“我需要打印到一个文件句柄吗?”我想是的,因为你在请求我们的帮助。是吗?!@zev.kronenberg,Re“是内部缓冲把我搞砸了吗?”对不起,不清楚?!@zev.kronenberg,Re“我应该把缓冲设置为零吗?”这毫无意义,我告诉过你应该怎么做。每当我在同一句话中听到“线程”和“打印不正确”时,我开始感到恐惧。这通常是一件很难正确完成的事情。