Читайте также:
|
|
Часто возникает необходимость синхронизировать приложения со специфическими событиями, возникающими в системе, или операциями, выполняемыми в других процессах. Скажем, если создается дочерний процесс, может быть, придется сделать так, чтобы родительский процесс ожидал его завершения и только потом продолжал свою работу.
Для синхронизации потока можно использовать следующие объекты ядра:
· Процессы
· Потоки
· Файлы
· Консольный ввод
· Уведомления об изменении файлов
· Объекты mutex
· Семафоры
· События (с автоматическим сбросом и сбросом вручную)
Каждый объект может находиться в одном из двух состояний: свободном (signaled) или занятом (nonsignaled). Потоки могут остановиться и ждать, пока какой-либо объект не освободится. Если, скажем, поток родительского процесса должен ждать завершения дочернего, его можно отправить "в спячку" до освобождения объекта ядра, идентифицирующего дочерний процесс.
В момент завершения соответствующих процессов объекты "процесс" получают статус свободных. Это относится и к объектам "поток". Когда поток создан и начинает исполнение своего кода, сопоставленный с ним объект ядра "поток" получает статус занятого. При завершении потока соответствующий объект ядра освобождается.
Понятия "свободен-занят" аналогичны обыкновенному флагу. Потоки спят, пока ожидаемые ими объекты заняты (флаг опущен). Объект освободился (флаг поднят) - спящий поток замечает это, просыпается и возобновляет исполнение.
Некоторые из перечисленных объектов ядра существуют лишь для синхронизации потоков. Например, поток с описателем объекта "процесс" может вызвать любые Win32 -функции, позволяющие изменить класс приоритета или получить код завершения процесса. Через этот же описатель поток может синхронизировать себя с завершением процесса. Описатель потока служит тем же целям: для управления потоком и его синхронизации с завершением другого потока.
Это же относится и к описателям файлов. Пользуясь таким описателем, можно считывать файл или записывать в него какие-либо данные и в то же время можно синхронизировать поток с окончанием операции асинхронного файлового ввода-вывода.
Последний тип объектов ядра "двойного назначения" - "консольный ввод". Он похож на объект "файл", и для его создания применима функция СreateFile. Приложение консольного типа может использовать описатель этого объекта для чтения данных из буфера ввода, а поток - для приостановки своей деятельности до появления в буфере ввода данных, позволяющих продолжить работу.
Прочие объекты ядра: уведомления об изменении файлов, объекты mutex, семафоры и события - служат одной цели: синхронизации потоков. Ряд функций Win32, предназначенных специально для работы с этими объектами, позволяют создавать или открывать объекты, синхронизировать с ними потоки и закрывать их. Никакие другие операции с подобными объектами ядра не допускаются.
Дата добавления: 2015-07-11; просмотров: 59 | Нарушение авторских прав