|
|
||
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 |