Казанский Государственный Технический Университет
Им. А.Н. Туполева

Контрольная работа

По дисциплине: «Системное программирование»
На тему:
«Потоковые функции, запуск, счетчик остановок»

Выполнил:
 студент гр.4432
Андриянков Д.Н.

Проверил:
Преподаватель каф. АСОиУ
Вафин Р.Р.

Казань 2004 г.
Введение.

За последние десять лет произошел мощный прорыв в области информационных технологий. За эти годы были разработано и выпущено в массовое промышленность, колоссальное количество микропроцессоров. Современные микропроцессоры стали позволять избавляться от многих программных ошибок на аппаратном уровне благодаря режиму, который назвали защищенным.
	На данный момент лидерами по выпуску микропроцессоров являются компании: Intel и AMD. Естественно с ростом возможностей аппаратной части вычислительной техники, также стало развиваться и программное обеспечение.
Были улучшены подходы при программировании операционных систем и прикладных программ. Операционные системы стали позволять увеличивать производительность вычислительной техники благодаря тому, что на одном компьютере стало возможным запустить на выполнение одновременно несколько прикладных программ. Такую возможность стали называть многозадачностью(от мультипрограммирование).
Лидером в области производства операционных систем, на текущее время, принадлежит Microsoft и продукт, который она выпускает, имеет название Windows.

Основные понятия и термины.

	Одними из основных понятий в операционной системе MS-Windows, являются процессы и потоки.
	Предположим на жестком диске есть исполняемый файл file.exe, то говорят что это модуль, но как только пользователь запускает его в работу и система переписывает код в ОЗУ, для выполнения возникает понятие процесса. Другими словами код, записанный в оперативную память вычислительной системы, для выполнения является процессом.
	Но ведь процесс необходимо выполнить, а в Windows это процесс разительно отличается от выполнения кода в операционной системе MS-DOS. Перечислю, пожалуй, основные отличия:
 - Если в операционной системе dos для каждого исполняемого файла создавали секцию или сегмент стека, то в Windows далеко не так. Поясню на примере: системная программа, программа А, пользуется стеком, стеком Б, то при запуске программой А прикладной программы В, возникает ситуация, которую программисты называют наследованием стека, т.е. программа В тоже начинает использовать стек Б!
 - Если ранее программа выполнялась команда за командой, пока не встретятся команды плавающего контроля(je, ja и т.д.) и действие проводилось только надо одной программой, то теперь ситуация в корне изменилась. Программы могут останавливать действие по выполнению своего кода, чтобы другие программы тоже могли выполнять свой код, при этом производительность системы в целом не падает, а при правильно организованной многозадачности возрастает.
	Но процессы инертны, т.е. сами они выполняться не могут. Отвечают же за исполнение кода, содержащегося в адресном пространстве процесса, потоки. Поток (thread) - некая сущность внутри процесса, получающая процессорное время для выполнения, название поток произошло от: «направление протекания процесса». Другими словами поток – это независимый поток управления, выполняемый в контексте некоторого процесса.
В каждом процессе есть минимум один поток. Этот первичный поток создается системой автоматически при создании процесса и имеет название «главного». Далее этот поток может породить другие потоки, т.е. в свою очередь новые и т.д. Таким образом, один процесс может владеть несколькими потоками, и тогда они одновременно исполняют код в адресном пространстве процесса.
	 Но ведь надо создать поток, т.к. процесс сам по себе выполняться не может. За это действие отвечает функция, которую будем называть – функцией потока.
	Итак, когда мы определились некоторыми понятиями многозадачности можно приступить, как примерно это реализуется на практике.

Создание потока.

	Вся потоковая многозадачность в MFC реализуется с помощью класса CWinThread. Кстати, что производным от него является класс CWinApp, формирующий поток приложения (главный поток).
	
	При использовании классов, отвечающих за работу в многозадачном режиме, в программу следует включать стандартный библиотечный файл afxmt.h.

	То есть в начале исходного кода написать подключение:

#include “afxmt.h”

Для создания рабочего потока предназначена функция AfxBeginThread библиотеки MFC:
CwinThread * AfxBeginThread (AFX_THREADPROC pfnThreadProc, 
LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0, DWORD dwCreateFlags = 0, 
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

Каждый поток внутри родительского процесса начинает свое выполнение с вызова специальной функции, называемой потоковой функцией. Выполнение потока продолжается до тех пор, пока не завершится его потоковая функция.
Адрес данной функции (т.е. входная точка в поток) передается в параметре pfnThreadProc. Все потоковые функции должны иметь следующий прототип:

UINT pfnThreadProc(LPVOID pParam);
Значение параметра pParam функции AfxBeginThread передается потоковой функции в качестве параметра. Это 32-разрядное число может использоваться для любых целей.
Начальный приоритет потока указывается в параметре nPriority. Если этот параметр равен 0, то используются установки приоритета текущего (родительского) потока.
Каждый поток имеет свой собственный стек. Размер стека указывается в параметре nStackSize. Если этот параметр равен нулю (общепринятый подход), то создаваемому потоку будет выделен стек такого же размера, что и у родительского потока, а при необходимости, размер стека может быть увеличен.
Параметр dwCreateFlags определяет состояние выполнения потока. Если данный параметр равен нулю, поток начинает выполняться немедленно. Если значение этого параметра равно CREATE_SUSPEND, то поток создается временно приостановленным, т.е. ожидающим запуска. Чтобы запустить такой поток, нужно вызвать функцию CWinThread::ResumeThread.
Параметр lpSecurityAttrs является указателем на набор атрибутов прав доступа, относящийся к данному потоку. Если этот параметр равен NULL, то набор атрибутов будет унаследован от родительского окна.
При успешном завершении функция AfxBeginThread возвращает указатель на объект потока, в противном случае возвращает ноль. Данный указатель необходимо сохранять, если впоследствии предполагается обращение из родительского потока к созданному потоку (например, для изменения приоритета или для временного приостановления потока).

Остановка потока.