<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.