Я изучаю 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.