Загрузка...
 
Печать

Потоки (Threads) и многопоточность в Windows


ОС MS Windows 95 представила программерам идею использования многозадачной (multitasking) операционной системы (даже несмотря на то, что в действительности она таковой не являлась, т.к. использовала т.н. "вытесняющую" (preemptive) многозадачность, при которой маленькие порции множества программ выполняются, можно сказать, одновременно, в порядке одной общей очереди). Суть идеи заключалась в том, что на одном компьютере могло одновременно выполняться несколько процессов (приложений), каждому из которых поочерёдно выделяются определённые порции процессорного времени, называемые временные срезы (time slices).
Многозадачность также даёт возможность делить каждый процесс на несколько отдельных процессов, называемых потоками (threads). У каждого потока есть своё предназначение, например: сканирование сетевой активности, поддержка пользовательского ввода, проигрывание звуков и т.д. Использование в одном приложении более чем одного потока называется многопоточностью (multithreading).

Создание отдельного потока внутри приложения - задача совсем несложная. Для создания потока ты создаёшь функцию (используя специальный прототип функции), которая содержит код, который необходимо выполнить в данном отдельном потоке. Прототип функции создания потока выглядит так:
Прототип объявления потока
DWORD WINAPI ThreadProc(LPVOID lpParameter);

Здесь аргумент lpParameter - это заданный программистом указатель, который затем необходимо будет указать при создании потока.
Создаём поток путём вызова функции CreateThread:
Прототип функции создания отдельного потока
HANDLE CreateThread(
	LPSECURITY_ATTRIBUTES lpThreadAbilities, // NULL
	DWORD dwStackSize, // 0
	LPTHREAD_START_ROUTINE lpStartAddress, // thread function
	LPVOID lpParameter, // Указатель, предоставляемый программистом. Может быть NULL
	DWORD dwCreationFlags, // 0
	LPDWORD lpThreadId // Получает идентификатор потока
);


Закрыть
noteОбрати внимание

Возвращаемое значение функции CreateThread - это его дескриптор, который также обязательно должен быть закрыт при завершении работы потока. В противном случае ресурсы не будут освобождены. Ресурсы, занятые созданным потоком, освобождаются путём вызова функции CloseHandle:
CloseHandle(hThread); // используй дескриптор, полученный при создании потока функцией CreateThread


Следующий пример создаёт в приложении отдельный поток и инициализирует его:
Пример создания отдельного потока и его инициализации
// Какая-либо функция создания отдельного потока
...
DWORD WINAPI MyThread(LPVOID lpParameter)
{
	BOOL *Active;
	Active = (BOOL*)lpParameter;
	*Active = TRUE; // Помечаем поток как активный

	// Вставляем исходный код здесь

	// Уничтожаем поток
	*Active = FALSE; // Помечаем поток как неактивный
	ExitThread(0); // Специальный вызов функции для закрытия потока
}

void InitThread()
{
	HANDLE hThread;
	DWORD ThreadId;
	BOOL Active;

	// Созадём поток, передавая определённую программистом переменную, которая
	// используется для сохранения статуса потока.
	hThread = CreateThread(NULL, 0,	(LPTHREAD_START_ROUTINE)MyThread, (void*)&Active, 0, &ThreadId);

	// Ожидаем завершения работы потока, путём постоянного отслеживания состояния флага активности
	while(Active == TRUE);

	// Закрываем дескриптор потока
	CloseHandle(hThread);
}
...

В данном примере в приложении создаётся отдельный поток, который начинает свою работу сразу после выполнения функции CreateThread. Во время вызова данной функции мы передаём указатель в переменную типа BOOL, которая отслеживает состояние потока (активен или нет), путём установки значений в TRUE или FALSE.
По завершении работы потока, выставляем флаг активности в FALSE, указывая, что поток более неактивен. Далее уничтожаем поток путём вызова функции ExitThread, имеющей всего один параметр - код уничтожения потока (termination code) (грубо говоря, причина, по которой закрывается данный поток). Обычно здесь просто указывают 0 (ноль).

По сути, поток - это обычная функция, которая выполняется параллельно со своим приложением.

===

ИСТОЧНИКИ:

  1. Adams J. "Programming Role Playing Games with DirectX, 2nd Ed.", 2004. Premier Press

Contributors to this page: slymentat .
Последнее изменение страницы Вторник 29 / Ноябрь, 2016 11:09:32 MSK автор slymentat.

Помочь проекту

Яндекс-деньги: 410011791055108