<ATOMIC_FETCH_OR Example Program>
Program atomic_fetch_or_example
Use iso_fortran_env
Implicit None
Integer(atomic_int_kind) :: bits(100)[*] = 0, bit, oldbits
Integer i,j
! Demonstrate setting individual bits in a bitmask without interference between images.
! The FETCH form is used to check that the bit was not already set.
Do i=1,Size(bits)
Do j=This_Image(),Bit_Size(bits),Num_Images()
bit = Shiftl(1_atomic_int_kind,j-1)
Call atomic_fetch_or(bits(i)[1],bit,oldbits)
If (Iand(oldbits,bit)/=0) Error Stop 'Bit already set'
End Do
End Do
Sync All
If (This_Image()==1) Then
Do i=1,Size(bits)
If (bits(i)/=Not(0)) Error Stop 'Bit not set'
End Do
Print *,'Bits set as expected.'
End If
End Program
■ Execution Results
Bits set as expected.