Parallel Programming Guide for HP-UX Systems

Parallel synchronization
Synchronizing code
Chapter 8158
AND DONEIN
LOGICAL INFLAG, OUTFLAG ! INPUT READ AND OUTPUT
WRITE FLAGS
C$DIR THREAD_PRIVATE (INFLAG,OUTFLAG) ! ONLY NEEDED BY
TASK 1
C (WHICH RUNS ON
THREAD 0)
IF (NUM_THREADS() .LT. 8) STOP 1
IN = 10
OUT = 11
LOCK = ALLOC_GATE(INGATE)
LOCK = ALLOC_GATE(OUTGATE)
IBAR = ALLOC_BARRIER(COMPBAR)
DONECOMP = .FALSE.
C$DIR BEGIN_TASKS ! TASK 1 STARTS HERE
INFLAG = .TRUE.
DONEIN = .FALSE.
ALLOCATE(DIN(1000),DOUT(1000)) ! ALLOCATE LOCAL
BUFFERS
DO WHILE(.NOT. INDONE() .OR. .NOT. COMPDONE() .OR.
NOUT .GT. 0)
C DO TILL EOF AND COMPUTATION DONE
AND OUTPUT DONE
IF(NIN.LT.1000.AND.(.NOT.COMPDONE()) .AND.(.NOT.
INDONE())) THEN
C FILL QUEUE
IF (INFLAG) THEN ! FILL BUFFER FIRST:
READ(IN, IOSTAT = IOS) DIN ! READ A RECORD;
QUIT ON EOF
IF(IOS .EQ. -1) THEN
DONEIN = .TRUE. ! SIGNAL THAT INPUT IS DONE
INFLAG = .TRUE.
ELSE
INFLAG = .FALSE.
ENDIF
ENDIF
C SYNCHRONOUSLY ENTER INTO INPUT QUEUE:
C BLOCK QUEUE ACCESS WITH INGATE:
IF (COND_LOCK_GATE(INGATE) .EQ. 0 .AND. .NOT.