Синхронизация задач
При использовании параллельно работающих задач возникает проблема синхронизации их выполнения.
Изменим немного программу, показанную на рис. 1.4. С помощью гипотетической функции Start запустим подпрограммы PlayMusic и Calculate как задачи в рамках одного процесса (рис. 1.5). Мы постараемся составить программу так, чтобы одновременно с вычислениями она делала что-нибудь еще, например, играла музыку.
Рис. 1.5. Запуск двух задач, первая из которых играет музыку, а вторая выполняет длительные вычисления
Теперь после получения данных одновременно выполняется проигрывание музыки и сложный расчет. Но вот вопрос - что сделает функция Start, после того как будет запущена задача, имя которой передается ей в качестве параметра?
Если составить эту функцию таким образом, чтобы она дожидалась завершения выполнения запускаемой ей задачи, то пользователь вначале прослушает музыкальное произведение, а затем компьютер приступит к многочасовому расчету. После завершения расчета начнется печать. То есть все осталось, как и раньше.
Если же функция Start вернет управление сразу после запуска задачи, то вначале заиграет музыка, а потом на фоне музыки будет запущен расчет. Но тут нас поджидает другая неприятность - сразу после запуска расчета принтер начнет печать, не дожидаясь, пока задача Calculate подготовит необходимые для этого данные.
Операционная система IBM OS/2 допускает оба варианта запуска задач, обеспечивая дополнительно такие средства синхронизации задач, как критические секции и семафоры.