omp_lock_t writelock;
omp_init_lock(&writelock);
#pragma omp parallel for
for ( i = 0; i < x; i++ )
{
// some stuff
omp_set_lock(&writelock);
// one thread at a time stuff
omp_unset_lock(&writelock);
// some stuff
}
omp_destroy_lock(&writelock);
Большинство процедур блокировки, таких как семафоры pthreads и семавы sysv, работают над такой логикой, хотя конкретные вызовы API различаются.
Ответ 2
В интересах тех, кто приходит после, использование critical на самом деле проще здесь (код и чтение). Вы даже можете сделать именованные критические разделы.
Например:
#include <omp.h>
void myParallelFunction()
{
#pragma omp parallel for
for(int i=0;i<1000;++i)
{
// some expensive work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
// other work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
}
}