5. ВЗАИМОДЕЙСТВИЕ ЧЕРЕЗ ПЕРЕМЕННЫЕ СОСТОЯНИЯ
В ¬¬4.1 и 4.3 мы проиллюстрировали применение общего семафора. Это проверенное и удобное средство использовалось для реализации довольно примитивной формы взаимодействия. Правила работы потребителя были очень просты: есть что-нибудь на буфере - бери.
Если необходимо построить несколько взаимодействующих последовательных процессов так, чтобы их общее поведение удовлетворяло более сложным требованиям, и вся совокупность в целом работала в определенном смысле правильно, то следует ожидать, что достигнуть этого можно только в случае, когда и сами отдельные процессы и способы их взаимодействия будут более изощренными. Нельзя надеяться, что мы получим решение с помощью уже имеющихся и таких простых средств, как общий семафор. Нам может потребоваться вся гибкость, на которую способна программа универсальной вычислительной машины.
В нашем распоряжении имеется сейчас некоторый исходный материал: мы можем определять отдельные процессы; эти процессы могут связываться друг с другом через общие переменные; наконец, у нас есть средства синхронизации. Однако совершенно не очевидно, как всем этим пользоваться. Сейчас нам необходимо научиться применять этот материал, развить стиль "параллельного программирования". Нужно подчеркнуть два момента.
Во-первых, мы столкнемся с большой свободой выбора. При взаимодействии процессов могут возникать решения, которые касаются более чем одного процесса, и не всегда очевидно, какой из процессов должен принять то или иное решение. Если мы не сможем найти какой-то руководящий принцип (например, соображения эффективности), то нужно иметь смелость наложить ради определенности некоторые ограничения.
Во-вторых, если для нас представляют интерес реально работающие системы, то требуется убедиться (и убедить всех сомневающихся) в корректности наших построений. При не параллельном программировании программист уже сталкивается с задачей проверки программы (трудность этой задачи, кстати, часто недооценивают); но там он еще может надеяться отладить программу с помощью тестов. В нашем случае системе часто придется работать в невоспроизводимых обстоятельствах, и мы едва ли можем ожидать сколько-нибудь серьезной помощи от тестов. Поэтому вопросы проверки программы должны интересовать нас с самого начала.
Теперь мы приступим к более сложному примеру в надежде приобрести некоторый опыт, который можно будет использовать в качестве руководящего принципа.