Хабаровский государственный технический университет
Кафедра “Вычислительная техника”
Лабораторная работа №3.
Тема: Многопоточность в приложениях.
Выполнил: студент Миронов А. С ВМ-91
Проверил: Миллер Д .А
Хабаровск 2003
Тема: Многопоточность в приложениях.
Техническое задание: разработать приложение, иллюстрирующее работу семафоров: имеется пять потоков, но одновременный доступ к общему ресурсу имеют только три из них, остальные два ждут завершения работы одного из работающих потоков (инициализация выбранных потоков происходит при нажатии на соответствующую потоку кнопку).
Краткие теоретические сведения из теории.
1. Понятие потока.
Одно приложение одновременно может выполнять несколько потоков. Поток для приложения является тем же, что и приложение для ОС (ОС может одновременно выполнять несколько приложений). Если в приложении выполняются несколько потоков, то чаще это означает, что выполняется несколько приложений внутри одного целого приложения. Таким образом приложение может с успехом решать одновременно больше задач.
Определение
Поток часто называемый нитью – это создаваемый Windows объект ( один или несколько) внутри процесса, который выполняет инструкции программы. Поток позволяет осуществить параллельное выполнение процессов и одновременное выполнение одним процессом различных частей программы.
Для создания независимых потоков можно использовать функцию AfxBeginThread причем в двух вариантах:
- можно передать функции вызываемую для выполнения задач потока функцию;
- можно передать указатель на динамический класс для объекта, для объекта класса CWinThread. Обе функции возвращают указатель на объект класса СWinThread, который запускается как независимый поток.
В первой версии функции AfxBeginThread первым аргументом является указатель на главную функцию запускаемого потока. Функция, адресуемая этим указателем, является аналогом главной функции в программе на С++. Она управляет выполнением потока. Эта функция должна быть определена как функция UINT с одним аргументом типа LPVOID:
UINT MyThreadFunc(LPVOID param)
Данная версия функции AfxBeginThread требует наличие второго аргумента, передаваемого главной функции потока в качестве единственного ее аргумента. Этот аргумент должен быть указателем на структуру, содержащую всю информацию, необходимую для коретного ваполнения задания потоком.
Первый аргумент второй версии функции AfxBeginThread является указателем на объект класса производного от CWinThread .
Следующие аргументы для функции AfxBeginThread одинаковы в обоих версиях, являются не обязательными и представляют:
- Приоритет (по умолчанию THREAD_PRIORITY_NORMAL)
- Размер стека (по умолчанию 0 – размер стека такой же как у главного приложения)
- Флаг создания потока. Если CREATE_SUSPENDED, то поток создается в приостановленном или отложенном режиме и не будет запущен пока для него не будет выполнена функция RESUMTHREAD. Если в качестве этого аргумента передается 0 (значение по умолчанию), то поток начнет выполняться с момента его создания.
- Указатель на атрибуты защиты потока. По умолчанию этот аргумент принимает значение NULL, что обуславливает создание потока, имеющего ту же совокупность параметров защиты, что главное приложение.
1. Управление доступом к совместно используемым ресурсам.
Так как различные потоки могут обращаться к одним и тем же ресурсам – это может привести к различным проблемам в многопотоковых приложениях:
Пример
К одному и тому же массиву обращаются два потока – один читает/добавляет данные, другой так же читает/добавляет данные может случиться так, что поток читающий данные прочтет данные не из той позиции в которую он их поместил (вмешался другой поток и переставил данные).
Существуют четыре механизма ограничения доступа к общим ресурсам и синхронизации работы обработки данных потоками:
- критические секции программы
- взаимные исключения, флаги(mutexes)
- семафоры
- события.
Критическая секция – отрезок программы, который должен выполняться без прерываний со стороны других процессов.
Мьютекс – специальный синхронизирующий объект в межпроцессном взаимодействии, подающий сигнал, когда он не захвачен каким – либо потоком. Мьютексы часто называются взаимными исключениями, флагами – элементом синхронизации событий в программировании.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.