Далее основной поток пробуждает рабочие
Далее основной поток пробуждает рабочие
Создание эффективных Win32-приложений - ДЖ. Рихтер
Программа иллюстрирует типичный сценарий программирования, который выглядит так. Поток порождает несколько рабочих потоков, а затем инициализирует блок памяти. Далее основной поток пробуждает рабочие потоки, чтобы они начали обработку содержимого этого блока памяти. В данный момент основной поток должен приостановить себя до тех пор, пока все рабочие потоки не выполнят свои задачи. После этого основной поток записывает в блок памяти новые данные и вновь пробуждает рабочие потоки.
На примере этого кода хорошо видно, насколько тривиальным становится решение этой распространенной задачи программирования при использовании C++. Класс CWhenZero дает нам гораздо больше возможностей — не один лишь инверсный семафор. Мы получаем теперь безопасный в многопоточной среде объект данных, который переходит в свободное состояние, когда его значение обнуляется! Вы можете не только увеличивать и уменьшать счетчик семафора на 1, но и выполнять над ним любые математические и логические операции, в том числе сложение, вычитание, умножение, деление, вычисления по модулю! Так что объект CWhenZero намного функциональнее, чем объект ядра «семафор».
С этими классами шаблонов C++ можно много чего придумать. Например, создать класс CInterlockedString, производный от CInterlockedType, и с его помощью безопасно манипулировать символьными строками. А потом создать класс CWhenCertain- String, производный от CInterlockedString, чтобы освобождать объект ядра «событие», когда строка принимает определенное значение (или значения). В общем, возможности безграничны.
public: // открытые функции-члены
// Примечание: конструкторы и деструкторы всегда безопасны // в многопоточной среде.