We recommend using Visual Studio 2017
This documentation is archived and is not being maintained.

A.16 Using Locks

In the following example, (for Section 3.2 on page 41) note that the argument to the lock functions should have type omp_lock_t, and that there is no need to flush it. The lock functions cause the threads to be idle while waiting for entry to the first critical section, but to do other work while waiting for entry to the second. The omp_set_lock function blocks, but the omp_test_lock function does not, allowing the work in skip() to be done.

// omp_using_locks.c
// compile with: /openmp /c
#include <stdio.h>
#include <omp.h>

void work(int);
void skip(int);

int main() {
   omp_lock_t lck;
   int id;

   #pragma omp parallel shared(lck) private(id)
      id = omp_get_thread_num();

      printf_s("My thread id is %d.\n", id);

      // only one thread at a time can execute this printf

      while (! omp_test_lock(&lck)) {
         skip(id);   // we do not yet have the lock,
                     // so we must do something else 
      work(id);     // we now have the lock
                    // and can do the work