Составители:
Рубрика:
Standby (ближайший) – готов быть выполненным следующим;
Running (выполнение) – находится в режиме выполнения и взаимодейст-
вует с центральным процессором;
Waiting (ожидание) – не выполняется, ожидая сигнала выполнения;
Transition (промежуточное) – будет выполняться после того, как система
загрузит его контекст;
Terminated (завершен) – выполнение завершено, однако объект не удален.
Когда программа-планировщик выбирает из очереди готовый
к выполнению поток, она загружает его контекст. В состав контекста входит
набор значений регистров процессора, стек ядра, блок параметров окружения
потока и пользовательский стек в адресном пространстве процесса, который
является владельцем данного потока. Если часть контакта была записана на
диск, поток проходит в промежуточное состояние и ожидает, пока система со-
берет все составные части контекста.
Чтобы потоки могли надежно работать, их необходимо синхронизировать.
Представьте себе, что один поток создает кисть, а затем создает несколько по-
токов, которые вместе используют эту кисть для выполнения графических
операций. Первый поток не должен уничтожать кисть до тех пор, пока другие
потоки не завершат операции рисования. Или представьте себе, что один поток
принимает данные, введенные пользователем, и записывает их в файл, а дру-
гие потоки считывают данные из этого файла и образовывают введенный
текст. Считывание не должно происходить в тот момент, когда идет запись.
В обоих случаях надо принять меры по координации последовательности опе-
раций в нескольких потоках.
Одно из возможных решений заключается в создании глобальной пере-
менной типа Boolean, которую один из потоков будет использовать с целью
информирования других потоков о том, что объект занят. Например, поток, за-
писывающий данные в файл, может присвоить переменной bDone значение
TRUE, а потоки, считывающие данные из файла, будут циклически просмат-
ривать эту переменную до тех пор, пока ее значение не изменится. Такая схема
вполне работоспособна, однако циклический просмотр флага несколькими по-
токами занимает много времени процессора. Вот почему в Win32 поддержи-
вается набор синхронизирующих объектов [2]. Перечислим их.
– объект типа исключающий семафор функционирует подобно узкой
двери, «пропуская» (т. е. давая допуск) одновременно по одному потоку;
– объект типа семафор функционирует подобно многостворчатой две-
ри, ограничивая количество потоков, которые могут проходить через него
одновременно;
– объект типа события передает глобальный сигнал, воспринимаемый
любым потоком, для которого он адресован;
– объект типа критический раздел аналогичен исключающему семафо-
ру, но работает только в пределах одного процесса.
Все указанные объекты являются системными и создаются менеджером
17
Standby (ближайший) – готов быть выполненным следующим; Running (выполнение) – находится в режиме выполнения и взаимодейст- вует с центральным процессором; Waiting (ожидание) – не выполняется, ожидая сигнала выполнения; Transition (промежуточное) – будет выполняться после того, как система загрузит его контекст; Terminated (завершен) – выполнение завершено, однако объект не удален. Когда программа-планировщик выбирает из очереди готовый к выполнению поток, она загружает его контекст. В состав контекста входит набор значений регистров процессора, стек ядра, блок параметров окружения потока и пользовательский стек в адресном пространстве процесса, который является владельцем данного потока. Если часть контакта была записана на диск, поток проходит в промежуточное состояние и ожидает, пока система со- берет все составные части контекста. Чтобы потоки могли надежно работать, их необходимо синхронизировать. Представьте себе, что один поток создает кисть, а затем создает несколько по- токов, которые вместе используют эту кисть для выполнения графических операций. Первый поток не должен уничтожать кисть до тех пор, пока другие потоки не завершат операции рисования. Или представьте себе, что один поток принимает данные, введенные пользователем, и записывает их в файл, а дру- гие потоки считывают данные из этого файла и образовывают введенный текст. Считывание не должно происходить в тот момент, когда идет запись. В обоих случаях надо принять меры по координации последовательности опе- раций в нескольких потоках. Одно из возможных решений заключается в создании глобальной пере- менной типа Boolean, которую один из потоков будет использовать с целью информирования других потоков о том, что объект занят. Например, поток, за- писывающий данные в файл, может присвоить переменной bDone значение TRUE, а потоки, считывающие данные из файла, будут циклически просмат- ривать эту переменную до тех пор, пока ее значение не изменится. Такая схема вполне работоспособна, однако циклический просмотр флага несколькими по- токами занимает много времени процессора. Вот почему в Win32 поддержи- вается набор синхронизирующих объектов [2]. Перечислим их. – объект типа исключающий семафор функционирует подобно узкой двери, «пропуская» (т. е. давая допуск) одновременно по одному потоку; – объект типа семафор функционирует подобно многостворчатой две- ри, ограничивая количество потоков, которые могут проходить через него одновременно; – объект типа события передает глобальный сигнал, воспринимаемый любым потоком, для которого он адресован; – объект типа критический раздел аналогичен исключающему семафо- ру, но работает только в пределах одного процесса. Все указанные объекты являются системными и создаются менеджером 17
Страницы
- « первая
- ‹ предыдущая
- …
- 15
- 16
- 17
- 18
- 19
- …
- следующая ›
- последняя »