Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Операции с потоками
Для выполнения операций с потоками, прежде всего, необходимо получить идентификатор потока. Его мы можем получить от функции CreateProcess, CreateThread или GetCurrentThread, которая возвращает дескриптор текущего потока. Наряду с дескриптором каждый поток имеет общесистемный идентификатор, который мы можем узнать, вызвав функцию GetCurrentThreadId. Получить доступ к другому потоку, зная его идентификатор можно с помощью функции OpenThread: HANDLE OpenThread( DWORD dwDesiredAccess, // access right BOOL bInheritHandle, // handle inheritance option DWORD dwThreadId // thread identifier ); Одно из основных действий, которое мы можем производить с потоком, это приостановление и возобновление его работы. При приостановлении поток переводится в состояние ожидания и не использует процессорное время. Как мы помним, поток можно создать в приостановленном состоянии, если передать функции создания потока флаг CREATE_SUSPENDED. Для того чтобы сделать приостановленный поток активным (планируемым) необходимо вызвать функцию ResumeThread: DWORD ResumeThread( HANDLE hThread // handle to thread ); Мы также можем в любой момент приостановить выполнение потока, вызвав функцию SuspendThread: DWORD SuspendThread( HANDLE hThread // handle to thread ); Любой поток может перевести себя на некоторое время в приостановленное состояние, вызвав функцию Sleep: VOID Sleep( DWORD dwMilliseconds // sleep time ); Параметр dwMilliseconds задает время в миллисекундах, на которое поток «заснет». Эту функцию нужно использовать в случаях, когда необходимо задержать выполнение потока на некоторое время. В однозадачных системах для этого обычно делают цикл, который проверяет системное время и сравнивает его с начальным моментом. Однако в многозадачной системе такой вариант не приемлем – подобный цикл будет напрасно расходовать все процессорное время, снижая работоспособность системы. В это же время функция Sleep позволяет решить ту же задачу, не загружая процессор. Рекомендуется использовать Sleep и в том случае, если все-таки не удалось обойтись без проверки какого-либо условия в цикле. В этом случае помещенная внутрь цикла функция Sleep c небольшим интервалом позволит снизить нагрузку на процессор. Впрочем, это все-таки не очень хороший вариант и лучше постараться организовать ожидание с помощью объектов синхронизации и Wait-функций, которые мы рассмотрим далее.
|