OpenMP возможна тупиковая ситуация в одноядерной системе C - PullRequest
0 голосов
/ 31 декабря 2018

Я изучаю OpenMP и хочу понять этот код на C в одноядерной системе.(код программы не мой)

#include <stdio.h>
#include <omp.h>

int main()
{
    omp_lock_t lock;
    #pragma omp parallel num_threads(2)
    {
        #pragma omp single
        {
            omp_init_lock(&lock);
            omp_set_lock(&lock);

            #pragma omp task
            {
                omp_set_lock(&lock);
                printf("task = 0, thread = %d\n", omp_get_thread_num());
            }

            #pragma omp task
            {
                printf("task = 1, thread = %d\n", omp_get_thread_num());
                omp_unset_lock(&lock);
            }
        } // end of single region, implicit bar & TSP=Tasking Sync Point
    } // end of parallel region, implicit bar
}

Вызовы printf в следующем тексте называются task0 и task1.

  • Как возникает тупикздесь?

Здесь у меня 2 двух потока, и, насколько я знаю, если у меня одноядерная система, только поток может «работать» одновременно (давайте забудем о «физический поток на ядро ​​в этом случае, я точно не знаю, как это называется).Цель этого примера состоит в том, что задача0 должна быть создана перед задачей1, но задача1 должна быть выполнена ДО задачи0.

В тексте приведены примечания, указывающие на возможность переключения потоков (чтоЯ имею в виду, что если thread0 работает, то thread1 может быть запланирован, даже если thread0 не завершил свою работу. И что НЕТ ПЕРЕКЛЮЧАТЕЛЯ ЗАДАЧИ (означает ли это, что если thread0 выполняет t0, то он никогда не выполнит t1? И еслиthread1 выполняет t1, затем он будет «заблокирован» на t1 до тех пор, пока не завершится. Если так, почему это так? Напомню, что мы работаем в одноядерной системе)

Также мне не ясно,удваивается omp_set_lock(&lock) перед первым заданием и даже внутри задания0.

...