Parallel Programming Guide for HP-UX Systems

Parallel synchronization
Synchronizing code
Chapter 8 159
INDONE()) THEN
QIN(:,IN_QIN) = DIN(:) ! COPY INPUT BUFFER
INTO QIN
IN_QIN=1+MOD(IN_QIN,1000) ! INCREMENT INPUT
BUFFER PTR
NIN = NIN + 1 ! INCREMENT INPUT QUEUE ENTRY
COUNTER
INFLAG = .TRUE.
LOCK = UNLOCK_GATE(INGATE) ! ALLOW INPUT
QUEUE ACCESS
ENDIF
ENDIF
C SYNCHRONOUSLY REMOVE FROM OUTPUT QUEUE:
C BLOCK QUEUE ACCESS WITH OUTGATE:
IF (COND_LOCK_GATE(OUTGATE) .EQ. 0) THEN
IF (NOUT .GT. 0) THEN
DOUT(:)=QOUT(:,OUT_QOUT) ! COPY OUTPUT QUE
INTO BUFFR
OUT_QOUT=1+MOD(OUT_QOUT,1000)
C INCREMENT OUTPUT
BUFR PTR
NOUT = NOUT - 1 ! DECREMENT OUTPUT QUEUE
ENTRY COUNTR
OUTFLAG = .TRUE.
ELSE
OUTFLAG = .FALSE.
ENDIF
LOCK = UNLOCK_GATE(OUTGATE)
C ALLOW OUTPUT QUEUE
ACCESS
IF (OUTFLAG) WRITE(OUT) DOUT ! WRITE A RECORD
ENDIF
ENDDO
C TASK 1 ENDS HERE
C$DIR NEXT_TASK ! TASK 2:
CALL
THREAD_WRK(NIN,NOUT,QIN,QOUT,IN_QIN,OUT_QIN,IN_QOUT,OUT_
QOUT)
IBAR = WAIT_BARRIER(COMPBAR,7)
C$DIR NEXT_TASK ! TASK 3:
CALL
THREAD_WRK(NIN,NOUT,QIN,QOUT,IN_QIN,OUT_QIN,IN_QOUT,OUT_