OpenMP Locks

Consider the following annotated C/C++ serial code:

  int count;
  void Tick() {
    ANNOTATE_LOCK_ACQUIRE(0);   
       count++; 
    ANNOTATE_LOCK_RELEASE(0);

To implement a lock, use the OpenMP types, variables, and functions to provide more flexible and powerful use of locks. For example, for simple locks, use the omp_lock_t type in C/C++ or the type=omp_lock_kind in Fortran.

Locks can be wrapped inside C++ classes, as shown in the following parallel C/C++ code:

#include <omp.h>
  int count;
  omp_lock_t countMutex;
 
struct CountMutexInit {
     CountMutexInit() { omp_init_nest_lock   (&countMutex);   }
    ~CountMutexInit() { omp_destroy_nest_lock(&countMutex); }
} countMutexInit;     

// The declaration of the above object causes countMutex to
// be initialized on program startup, and to be destroyed when
// the program completes, via the constructor and destructor.


struct CountMutexHold {
     CountMutexHold() { omp_set_nest_lock    (&countMutex); }
    ~CountMutexHold() { omp_unset_nest_lock  (&countMutex); }
};

void Tick() {
    // unlocks on scope exit
    CountMutexHold releaseAtEndOfScope;
      count++; 
    }
    ...

Consider the following annotated Fortran serial code:

program BBB
   integer(kind=4) :: count = 0
 . . .
contains
subroutine Tick
  call annotate_lock_acquire(0)
    count = count + 1
  call annotate_lock_release(0)
end subroutine Tick
 . . .
end program BBB

For simple locks with Fortran code, use the type=omp_lock_kind. The parallel Fortran code follows after adding use omp_lib and the integer declaration for count:

program BBB
  use omp_lib
  integer(kind=4) :: count = 0
  integer (kind=omp_lock_kind) countMutex
  call omp_nest_lock_init(countMutex)
  . . .

  contains
   subroutine Tick
   call omp_set_nest_lock(countMutex)
       count = count + 1
   call omp_unset_nest_lock(countMutex)
   end subroutine Tick
 . . .
end program BBB

Optimization Notice: 

For more complete information about compiler optimizations, see our Optimization Notice.