gpt4 book ai didi

multithreading - Perl 线程打印不正确

转载 作者:行者123 更新时间:2023-12-02 05:29:24 25 4
gpt4 key购买 nike

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

#!/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 Run_Threads{

my @threads;

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

foreach (@threads){
$_->join;
}
}

最佳答案

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

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

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;) ,您还需要加载 IO::Handle .

<小时/>

顺便说一下,

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";

关于multithreading - Perl 线程打印不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8996625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com