У меня есть функция, которую я должен удостовериться, что когда она вызывается, она запускается только в одном потоке. Поэтому моя функция - это нечто вроде этого:
int ReadValue(int position)
{
// read data from a file
}
Эта функция может быть вызвана из других функций, которые на какой-то стадии могут быть частью openmp parallel for.
Я хочу убедиться, что он запускается только в одном потоке, если он вызывается параллельно.
Как я могу это сделать?
Здесь полный пример (проверен на 8 ядер/потоков):
#include <omp.h>
static int counter = 0;
int ReadValue(int position)
{
// read data from a file one thread at a time
#pragma omp critical
{
// critical section code goes here
++counter;
}
return counter;
}
int main() {
const int count = 1 << 20;
// loop and raise protected counter
#pragma omp parallel for
for (int i = 0; i < count; ++i) {
ReadValue(i);
}
// if counter was properly protected nothing will be printed.
if (ReadValue(0) != count + 1)
printf("failure!");
return 0;
}