Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Materialy_po_SP_2013.doc
Скачиваний:
270
Добавлен:
11.05.2015
Размер:
754.69 Кб
Скачать

35 Синхронизация потоков с объектами ядра. Функции ожидания объектов ядра

Механизмы синхронизации с помощью критических секций и на основе глобальных переменных процесса, обладают существенным недостатком — они не подходят для синхронизации потоков разных процессов. В таких случаях операционная система должна предоставлять потокам системные объекты синхронизации, которые были бы видны для всех потоков, даже если они принадлежат разным процессам и работают в разных адресных пространствах.

Примерами таких синхронизирующих объектов ОС являются системные семафоры, мьютексы, события, таймеры и другие — их набор зависит от конкретной ОС, которая создает эти объекты по запросам процессов. Чтобы процессы могли разделять синхронизирующие объекты, в разных ОС используются разные методы. Некоторые ОС возвращают указатель на объект. Этот указатель может быть доступен всем родственным процессам, наследующим характеристики общего родительского процесса. В других ОС процессы в запросах на создание объектов синхронизации указывают имена, которые должны быть им присвоены. Далее эти имена используются разными процессами для манипуляций объектами синхронизации. В таком случае работа с синхронизирующими объектами подобна работе с файлами. Их можно создавать, открывать, закрывать, уничтожать. Кроме того, для синхронизации могут быть использованы такие «обычные» объекты ОС, как файлы, процессы и потоки. Все эти объекты могут находиться в двух состояниях: сигнальном и несигнальном — свободном. Для каждого объекта смысл, вкладываемый в понятие «сигнальное состояние», зависит от типа объекта. Так, например, поток переходит в сигнальное состояние тогда, когда он завершается. Процесс переходит в сигнальное состояние тогда, когда завершаются все его потоки. Файл переходит в сигнальное состояние в том случае, когда завершается операция ввода-вывода для этого файла. Для остальных объектов сигнальное состояние устанавливается в результате выполнения специальных системных вызовов. Приостановка и активизация потоков осуществляются в зависимости от состояния синхронизирующих объектов ОС.

В Windowsесть специальные функции ожидания синхронизирующих объектов ядра (wait-функции) позволяют потоку в любой момент приостановиться и ждать освобождения какого-либо объекта ядра. Из всего семейства этих функций чаще всего используетсяWaitForSingleObject:

DWORDWaitForSingleObject(HANDLEhObject,DWORDdwMilliseconds);

Когда поток вызывает эту функцию, первый параметр, hObject, идентифицирует объект ядра, поддерживающий состояния «свободен-занят». Второй параметр,dwMilliseconds, указывает, сколько времени (в миллисекундах) поток готов ждать освобождения объекта.

Следующий вызов сообщает системе, что поток будет ждать до тех пор, пока не завершится процесс, идентифицируемый описателем hProcess.

WaitForSingleObject(hProcess,INFINITE);

В данном случае константа INFINITE, передаваемая во втором параметре, подсказывает системе, что вызывающий поток готов ждать этого события хоть целую вечность. Именно эта константа обычно и передается функцииWaitForSingleObject, но можно указать любое значение в миллисекундах.

Функция WaitForMultipleObjectsаналогичнаWaitForSingleObjectcтем исключением, что позволяет ждать освобождения сразу нескольких объектов или какого-то одного из списка объектов:

DWORD WaitForMultipleObjects( DWORD dwCount,

CONST HANDLE* phObjects, BOOL fWaitAll, DWORD dwMilliseconds);

Параметр dwCountопределяет количество интересующих объектов ядра Его значение должно быть в пределах от 1 доMAXIMUM_WAIT_OBJECTS(в заголовочных файлахWindowsоно определено как 64). ПараметрphObject— это указатель на мас сив описателей объектов ядра.

WaitForMultipleObjectsприостанавливает поток и заставляет его ждать освобождения либо всех заданных объектов ядра, либо одного из них. ПараметрfWaitAllкак раз и определяет, чего именно требуется от функции. Если он равенTRUE, функция не даст потоку возобновить свою работу, пока не освободятся все объекты.

Параметр dwMillisecondsидентичен одноименному параметру функцииWaitForSingleObject.

Возвращаемое значение функции WaitForMultipleObjectsсообщает, почему возобновилось выполнение вызвавшего ее потока.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]