2012-01-25 3 views
3

다른 게시물에 명시적인 예제가있는 경우 알려주십시오. 스레드에서 인터리브 인쇄에 문제가 있습니다. 모든 스레드에서 공유 변수를 사용하여 스레드를 제어하려고합니다. 아래의 의사 코드는 내 코드 조각을 강조 표시하여 문제를 일으 킵니다. 쓰레드가 인쇄 대기를하기 위해 모든 것을 시도했다. 지금은 몇 개의 출력 라인 만 파괴되고 있습니다.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; 
} 

하위 생성 스레드.

+0

언제나 "스레드"와 "정확하게 인쇄되지 않습니다"라는 동일한 문장에서 나는 두려움을 느끼기 시작합니다. 이것은 일반적으로 적절하게 수행하기가 어렵습니다. –

답변

5

각 스레드마다 고유 한 핸들과 자체 출력 버퍼가있는 것처럼 보입니다. 펄 파일 핸들이 threads::shared의 메커니즘을 사용하여 공유 될 수 없다는 것을 고려하면, 그다지 놀라운 일은 아닙니다.

즉, 잠금을 해제하기 전에 핸들 버퍼를 플러시해야 함을 의미합니다. 전에 ->flush->autoflush 방법을 사용하려면 (그러나 $|=1;에 대한) :

select->flush();  # Flush handle currently default for print. 

또는 당신은 손잡이에 매 인쇄 후 자동으로 플러시 펄을 가질 수 있습니다 : 당신은 명시 적으로 그렇게 할 수

select->autoflush(1); # Autoflush handle currently default for print. 
$| = 1;    # Autoflush handle currently default for print. 

주 Perl 5.14에서는 IO::Handle을로드해야합니다. 그런데


,

my $PRINTFLAG :shared = 1; 
lock($PRINTFLAG); 
cond_wait($PRINTFLAG) until $PRINTFLAG == 1; 
$PRINTFLAG = 0; 
print "$d\n"; 
$PRINTFLAG =1; 

은이 Threads::Queue를 사용하기 간단/더 나은의 스레드 내 경험에서

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

$ PRINTFLAG은 파일 핸들이 아닙니다. 나는 표준 출력으로 인쇄를 마치는 동안 스레드를 멈추기 위해이 프린터를 사용하려고합니다. 파일 핸들에 인쇄해야합니까? 내부 버퍼링이 나를 망쳤습니까? 버퍼를 0으로 설정해야합니까? –

+0

@ zev.kronenberg, Re : "$ PRINTFLAG는 파일 핸들이 아닙니다." – ikegami

+0

@ zev.kronenberg, Re "파일 핸들에 인쇄해야합니까?" 나는 당신이 그것을하기 위해 우리의 도움을 요청하기 때문에 그렇게 상상한다. ?!?! – ikegami

3

단순화 할 수있다.

두 개의 대기열이 있습니다. 하나는 실행중인 스레드 용이고 다른 하나는 스레드에서 나온 결과 용입니다.

그래서 내 마스터 스레드에서 결과 큐를 확인하고 인쇄합니다. 따라서 결과 파일에 액세스하는 어떠한 충돌도 발생하지 않습니다.

+0

앞으로이 문제를 시도해야 할 것입니다! –

관련 문제