Потоки в Windows
• Потоком в Windows называется объект ядра, которому операционная система выделяет процессорное время для выполнения приложения. • Каждому потоку принадлежат следующие ресурсы: qкод исполняемой функции; qнабор регистров процессора; qстек для работы приложения; qстек для работы операционной системы; qмаркер доступа, который содержит информацию безопасности. для системы
• В операционных системах Windows различаются потоки двух типов: üсистемные потоки; üпользовательские потоки. • В работающем приложении различаются потоки двух типов: üрабочие потоки (working threads); üпотоки интерфейса пользователя (user interface threads).
• Создается поток функцией create. Thread, которая имеет следующий прототип: HANDLE Create. Thread( LPSECURITY_ATTRIBUTES lp. Thread. Attributes, // атрибуты защиты DWORD dw. Stack. Size, // размер стека потока в байтах LPTHREAD_START_ROUTINE Ip. Start. Address, // адрес функции LPVOID lp. Parameter // адрес параметра DWORD dw. Creation. Flags, // флаги создания потока LPDWORD lp. Thread. Id // идентификатор потока );
• Поток завершается вызовом функции Exit. Thread, которая имеет следую щий прототип: VOID Exit. Thread( DWORD dw. Exit. Code // код завершения потока ); • Один поток может завершить другой поток, вызвав функцию Terminate. Thread, которая имеет следующий прототип: BOOL Terminate. Thread( HANDLE h. Thread, // дескриптор потока DWORD dw. Exit. Thread // код завершения потока );
• Исполнение каждого потока может быть приостановлено вызовом функции suspend. Thread, которая имеет следующий прототип: DWORD Suspend. Thread( HANDLE h. Thread // дескриптор потока ); • Эта функция увеличивает значение счетчика приостановок на 1 и, при успешном завершении, возвращает текущее значение этого счетчика. В случае неудачи функция Suspend. Thread возвращает значение, равное 1.
• Для возобновления исполнения потока используется функция Resume. Thread, которая имеет следующий прототип: DWORD Resume. Thread ( HANDLE h. Thread • Функция // дескриптор потока Resume. Thread уменьшает значение счетчика приостановок на 1 при условии, что это значение было больше нуля. Если полученное значение счетчика приостановок равно 0, то исполнение потока возобновляется, в противном случае поток остается в подвешенном состоянии.
• Поток может задержать свое исполнение вызовом функции sleep, которая имеет следующий прототип: VOID Sleep( DWORD dw. Milliseconds // миллисекунды );