К Т П           План занятия                                                              1                                           Страницы  | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 |

1. Определение потока

Определение потока тесно связано с последовательностью действий процессора во время исполнения программы. Исполняя программу, процессор последовательно выполняет инструкции программы, иногда осуществляя переходы в зависимости от некоторых условий. Такая последовательность выполнения инструкций программы называется потоком управления внутри программы. Отметим, что поток управления зависит от начального состояния переменных, которые используются в программе. В общем случае различные исходные данные порождают различные потоки управления. Поток управления можно представить как нить в программе, на которую нанизаны инструкции, выполняемые микропроцессором. Поэтому часто поток управления также называется нитью (thread). В русскоязычной литературе за потоком управления закрепилось название поток. Для пояснения понятия потока рассмотрим следующую программу, которая выводит минимальное число из двух целых чисел или сообщение о том, что числа равны:

 

#include <iostream.h>

int main ()

{

int a, b;

 

cout << “Input two integers: “

cin >> a >> b;

if (a == b)

{

cout <<"There is no min." << endl;

return 0;

}

 

if (a < b)

cout << "min = " << a << endl;

else

cout << "min = " << b << endl;

return 0;

}

 

Предположим, что перегруженные операторы ввода-вывода не образуют но­вых потоков. Тогда в зависимости от входных данных эта программа образует один из трех возможных потоков управления. А именно, если выполняется условие (а == b), то образуется поток:

 

cout << "Input two integers: "

cin >> a >> b;

if (a == b)

{

cout << "There is no min." << endl;

return 0;

}

 

Если выполняется условие (a < b), то образуется поток:

 

cout << "Input two integers: ";

cin >> a >> b;

if (a == b)

if (a < b)

cout << "min = " << a << endl;

return 0;

 

Если же выполняется условие (а > b), то образуется поток:

 

cout << "Input two integers: ";

cin >> a >> b;

if (a == b)

if (a < b)

cout << "min = " << b << endl;

return 0;

 

Теперь перейдем к классификации программ в зависимости от количества определяемых ими параллельных потоков управления. Будем говорить, что программа является многопоточной, если в ней может одновременно суще­ствовать несколько потоков. Сами потоки в этом случае называются па­раллельными. Если в программе одновременно может существовать только один поток, то такая программа называется однопоточной. Например, следующая программа, которая просто вычисляет сумму двух чисел, является однопоточной:

 

#include <iostream.h>

int sum(int a, int b)

{

return a + b;

}

int main()

{

int a, b;

int c = 0;

cout << "Input two integers: ";

cin >> a >> b;

c = sum (a, b);

cout << "Slim = " << c << endl;

return 0;

}

 

Теперь предположим, что после вызова функции sum функция main не ждет возвращения значения из функции sum, а продолжает выполняться. В этом случае получим программу, состоящую из двух потоков, один из которых определяется функцией main, а второй — функцией sum. Причем эти потоки независимы, т. к. они не имеют доступа к общим или, другими словами, разделяемым переменным. Правда в этом случае не гарантируется, что по­ток main выведет сумму чисел а и b, т. к. инструкция вывода значения суммы может отработать раньше, чем поток sum вычислит эту сумму.

Из этих рассуждений видно, что для того чтобы отметить функцию, которая порождает новый поток в программе, должна использоваться специальная нотация. В операционных системах Windows для обозначения того, что функция образует поток, используются специальные спецификаторы функции. Такая функция обычно также называется потоком.

 


Предыдущая        В начало страницы       Следующая
1