Udostępnij za pośrednictwem


A.16 za pomocą blokad

W poniższym przykładzie (dla sekcji 3.2 na stronie 41) Uwaga, że argument funkcji blokowania powinny mieć typ omp_lock_t, i że istnieje potrzeba jego opróżnienia.Funkcje Zablokuj powodują wątków pozostawać bezczynny podczas oczekiwania na wejściu do pierwszej sekcji krytycznej, ale inne pracę podczas oczekiwania na wejściu do drugiego.omp_set_lock Bloków funkcji, ale omp_test_lock funkcja nie jest dostępne, umożliwiające pracę w skip() do zrobienia.

Przykład

yf7xf9fb.collapse_all(pl-pl,VS.110).gifKod

// 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;

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

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

      // only one thread at a time can execute this printf
      omp_unset_lock(&lck);

      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 
      omp_unset_lock(&lck);
   }
   omp_destroy_lock(&lck);
}