Казалось бы, у каждого потока есть свой дескриптор и, следовательно, собственный выходной буфер. Учитывая, что дескрипторы файлов 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.
Примечание. Чтобы использовать методы ->flush
и ->autoflush
(но не для $|=1;
) до Perl 5.14, вам также необходимо загрузить 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";