Parallel Programming Guide for HP-UX Systems

Parallel synchronization
Synchronizing code
Chapter 8 163
.
. ! SIGNIFICANT PARALLEL CODE HERE USING WORK
ARRAY
.
ENDIF
IF (OUTFLAG) THEN ! IF PENDING OUTPUT, MOVE TO
OUTPUT QUEUE
C AFTER INPUT QUEUE IS USED IN COMPUTATION, FILL OUTPUT
QUEUE:
C$DIR CRITICAL_SECTION (OUTGATE) ! BLOCK ACCESS TO
OUTPUT QUEUE
IF(NOUT.LT.1000) THEN
C IF THERE IS ROOM IN THE
OUTPUT QUEUE
QOUT(:,IN_QOUT) = WORK(:) ! COPY WORK INTO
OUTPUT QUEUE
IN_QOUT =1+MOD(IN_QOUT,1000) ! INCREMENT
BUFFER PTR
NOUT = NOUT+1!INCREMENT OUTPUT QUEUE ENTRY
COUNTER
OUTFLAG = .FALSE. ! INDICATE NO OUTPUT
PENDING
ENDIF
C$DIR END_CRITICAL_SECTION
ENDIF
ENDDO ! END WORK/QOUT EMPTYING LOOP
END ! END THREAD_WRK LOGICAL FUNCTION
INDONE()
C THIS FUNCTION FORCES A MEMORY REFERENCE TO GET THE
DONEIN VALUE
LOGICAL DONEIN
COMMON /DONE/ DONEIN, DONECOMP
INDONE = DONEIN
END
LOGICAL FUNCTION COMPDONE()
C THIS FUNCTION FORCES A MEMORY REFERENCE TO GET THE
DONECOMP VALUE
LOGICAL DONECOMP