Синхронизация параллельных потоков
Во избежание возможных ошибок, связанных с использованием уже закрытого синхронизирующего объекта, рекомендуется при программировании использовать следующую схему. Синхронизирующий объект должен создаваться потоком, непосредственно не участвующим в процессе синхронизации (наиболее часто – это первичный поток). После создания синхронизирующего объекта рассматриваемый поток должен создать дочерние потоки (или процессы), которые будут непосредственно участвовать в процессе синхронизации. Порожденные таким образом потоки должны открывать созданный родительским потоком синхронизирующий объект перед использованием и закрывать после использования. Родительский поток должен дождаться завершения всех порожденных им потоков, а затем закрыть созданный им синхронизирующий объект. Эта схема будет корректно работать вне зависимости от того, наследуют ли порожденные потоки объекты ядра родительского процесса или нет. Напомним также, что для того, чтобы дочерний процесс унаследовал от родительского созданные последним объекты ядра, необходимо при создании процесса указать соответствующий параметр функции CreateProcess. Кроме того, при создании наследуемого синхронизирующего объекта требуется соответствующим образом заполнить поля структуры SECURITY_ATTRIBUTES, передаваемой в качестве одного из параметров функции создания объекта.
Объект ядра событие (event) используется для порождения некоторым потоком события, ожидаемого другим потоком. Для создания рассматриваемого объекта ядра служит функция CreateEvent, а для открытия уже созданного объекта ядра – функция OpenEvent. Для
ожидания события поток должен вызвать функцию WaitForSingleObject, передав ей в качестве
предыдущаяследующая