70
нитей, то случайным образом выбирается одна из них, а остальные
заблокированные нити продолжают ожидание.
Все неименованные критические секции
условно ассоциируются с
одним и тем же именем. Все критические секции, имеющие одно и тоже
имя,
рассматриваются единой секцией, даже если находятся в разных
параллельных областях. Побочные входы и выходы из критической
секции запрещены [11,14].
Пример 3.16.
#include
#include
int main()
{
int x;
x=0;
#pragma omp parallel shared(x)
{
#pragma omp critcal
{x=x+1;
printf(“x=%d\n”,x);
}}
return 0;}
В примере переменная x объявлена
вне параллельной области, она
является общей. В результате выполнения директивы
critical каждая нить
по очереди увеличит x на 1 и выведет результат на экран.
Если есть критическая секция, то в каждый момент времени
фрагмент будет обрабатываться лишь какой-либо одной нитью.
Остальные нити, даже если они уже подошли к данной точке программы и
готовы к работе, будут ожидать своей очереди. Если критической секции
нет, то все нити могут одновременно выполнить данный участок кода. С
одной стороны, критические секции предоставляют
удобный механизм
для работы с общими переменными. Но с другой стороны, пользоваться
им
нужно осмотрительно, поскольку критические секции добавляют
последовательные участки кода в параллельную программу,
что может
снизить её эффективность.
Достарыңызбен бөлісу: