Как убедиться, что часть кода выполняется только одним потоком (в openmp)

0

У меня есть функция, которую я должен удостовериться, что когда она вызывается, она запускается только в одном потоке. Поэтому моя функция - это нечто вроде этого:

 int ReadValue(int position)
 {
    // read data from a file 
 }

Эта функция может быть вызвана из других функций, которые на какой-то стадии могут быть частью openmp parallel for.

Я хочу убедиться, что он запускается только в одном потоке, если он вызывается параллельно.

Как я могу это сделать?

  • 2
    Это называется «критическая секция»; что вам нужно, это синхронизация потоков. Читайте здесь: computing.llnl.gov/tutorials/openMP/#Synchronization
Теги:
multithreading
openmp

1 ответ

0
Лучший ответ

Здесь полный пример (проверен на 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;
}
  • 0
    Благодарю. Как добавить к нему имя? Любой пример?
  • 0
    @mans: Добавлен фрагмент кода теста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню