57
}
printf("Сообщение 2\n");
}
return 0;
}
Данный пример иллюстрирует
применение директивы single
вместе с опцией
nowait. Сначала все нити напечатают текст "Сообщение
1", при этом одна нить (не обязательно нить-мастер)
дополнительно
напечатает текст "Одна нить". Остальные нити, не дожидаясь завершения
выполнения области
single, напечатают текст "Сообщение 2".
Таким
образом, первое появление "Сообщение 2" в выводе может встретиться
как до текста "Одна нить", так и после него. Если убрать опцию
nowait, то
по
окончании области single произойдёт барьерная синхронизация, и ни
одна выдача "Сообщение 2" не может появиться до выдачи "Одна нить".
Директива
master выделяет участок кода, который будет выполнен
только нитью-мастером. Остальные нити
просто пропускают данный
участок и продолжают работу с оператора,
расположенного следом за
ним. Неявной синхронизации данная директива не предполагает.
#pragma omp master
Пример 3.8.
#include
#include
int main()
{
int n;
#pragma omp parallel private(n)
{
n=1;
#pragma omp master
{
n=omp_get_thread_num();
}
printf("Значение n: %d\n", n);
}
return 0;
}
58
Пример показывает, что все потоки параллельной
области выведут
на экран 1, а главный поток выведет на экран свой номер, то есть 0.
Достарыңызбен бөлісу: