Использование спин-блокировки с c ++ openmp - PullRequest
1 голос
/ 04 октября 2019

Я реализовал этот метод с уникальной блокировкой и условной переменной. Он добавляет элемент в массив, но только если массив не заполнен. Если он заполнен, он ожидает, когда другие потоки извлекут элемент, и только потом помещает новый.

void Filter::put(Person person)
{
    std::unique_lock<std::mutex> guard(lock);
    cv.wait(guard, [&] { return !full; });
    container[count] = person;
    count++;
    empty = false;
    if (count == 10)
        full = true;
    cv.notify_all();
}

Моя цель - написать тот же метод с использованием OpenMP. Если я правильно понимаю, #pragma omp critical (name) должен делать то же самое, что и уникальный замок. Тем не менее, я не уверен, как я должен идти о спинлок.

1 Ответ

0 голосов
/ 04 октября 2019

Ну, если кому-то интересно, это решение, которое я придумала после небольшого количества проб и ошибок, и, похоже, оно работает нормально.

void Filter::put(Person person)
{
    while (full || omp_test_lock(&spinlock) == 0)
    {
    }
    container[count] = person;
    count++;
    empty = false;
    if (count == 10)
        full = true;
    omp_unset_lock(&spinlock);
}
...