Системное программное обеспечение
|
Лабораторная работа №7 Проектирование параллельных взаимодействующих вычислительных процессов Цель работы: овладение методикой создания мультитредового приложения средствами системного программирования Delphi и использование средств взаимного исключения. |
Создание многозадачных приложений с помощью системы программирования Delphi - общие сведения
В системе программирования Delphi содержит в себе стандартные классы, позволяющие использовать многопоточные возможности ОС. Для этого воспользуемся стандартным классомTThread. Объект, созданный на основе этого класса, характеризуется следующими свойствами:
каждый тред имеет свою, при необходимости уникальную, исполняемую часть;
каждый тред для своего исполнения требует отдельного процессорного времени, т.е. диспетчер задач принимает во внимание только приоритет треда;
диспетчеризация выполнения тредов осуществляется ОС и не требует вмешательства программиста;
несколько тредов, принадлежащих одному процессу, могут использовать один и тот же ресурс (например глобальную переменную), треды могут обращаться к полям другого треда из того же вычислительного процесса, при этом программисту необходимо самостоятельно ограничивать доступ к этому ресурсу.
Постановка задачи
необходимо создать многопоточное приложение в соответствие со схемой взаимодействия отдельных потоков (в соответствием с вариантом рис. 1).
Процесс А после своего завершения запускает задачи D, C и E.
Задачи B, D и C завершаются примерно в одинаковое время.
Поток F будет запускаться тем из тредов, который завершится первым, но только после завершения двух оставшихся тредов, приходящих в точку синхронизации 1.
Пусть задача G запускается последним закончившим работу потоком E или F.
Все указанные задачи должны быть созданы как потомки объекта TThread.
Методика решения задачи
Базовый объект TThreadProgress является потомком объекта TThread и имеет следующие поля:
имя;
строка состояния;
время работы в отсутствие конкурентов;
текущее состояние;
признак завершения;
имя запустившего треда;
строка для вывода сообщений в компонент TMemo.
Поля базового объекта:
исполняемая часть;
завершающая часть;
процедура прорисовки строки состояния;
процедура вывода сообщения;
Цикл задержки имитирует выполнение полезной работы.
Процедура завершения выполняет соответствующие действия.
Все задачи инициализируются одновременно, но в режиме ожидания запуска.
Информация о завершении того или иного потока находится в соответствующем поле.
Задача, запускающая другую задачу передает ей свое имя, обращаясь непосредственно к полю этого объекта (при многозадачности возникает критическая ситуация, когда несколько задач обращаются к общим ресурсам одновременно).
Каждый процесс имеет связь с видимыми компонентами (VCL-объектами) (строка состояния и текстовое сообщение), но доступ к ним синхронизирован.
Организация взаимного исключения основана на использовании метода критической секции с помощью объекта TCriticalSection:
участок кода каждого потока, в котором производится обращение к общему ресурсу, заключается в скобки критической секции – используются методы Enter и Leave;
если какой – либо тред уже находится внутри критической секции, то другой поток, который дошел до «открывающей скобки» Enter, не имеет права входить в критическую секцию до тех пор, пока первый поток находится в ней; когда первый тред выйдет из критической секции, второй сможет войти в нее и обратиться к критическому ресурсу.