Проблема драйвера считывателя

Если драйвер считывателя посылает сообщение управляющей программе, и, одновременно, управляющая программа посылает сообщение драйверу у нас возникает проблема. Состоит она в том, что две программы, одновременно пославшие друг другу сообщения, взаимно блокируются в ожидании ответа от оппонента. И хотя может показаться, что такая проблема не должна возникать часто, на практике это означает что она даст о себе знать во время демонстрации заказчику. Зачем управляющей программе вообще может потребоваться отсылать сообщение драйверу считывателя? Для примера, на некоторых считывателях есть цветной индикатор (зеленый/красный), показывающий разрешен или нет пользователю доступ, следовательно управляющая программа должна послать сообщение чтобы установить индикатор в определенное состояние. (Очевидно, что в этом примере есть несколько способов избежать взаимной блокировки; но в случае разработки структуры реальной системы, вам НИКОГДА не следует закладывать возможности создания такой ситуации!)

Лучший способ обойти возможность взаимной блокировки, это быть уверенным, что подобное никогда не может случится.

Этого можно достичь применяя так называемый метод «иерархии отправки сообщений». По существу это означает что структура вашего проекта должна быть разделена на несколько логических уровней. Тогда программы находящиеся на высоком уровне посылают сообщения только программам, находящимся на более «низком» уровне, а программы низкого уровня никогда не посылают сообщения программам более высокого уровня. Обмен сообщениями между программами на одном уровне так же должен быть исключен. При таком дизайне две программы никогда не заблокируют друг друга одновременными сообщениями.

К сожалению, такая структура проекта не позволит нам использовать «простое решение», которое мы обсуждали выше, а именно возможность отправки сообщения считывателем карт управляющей программе. Стандартное решение в таком случае – это неблокирующее сообщение, так называемый «импульс» («pulse»).

Такое сообщение может быть отправлено «вверх» в нашей структуре, и оно не нарушит ни одного из правил, так как не заблокирует отправителя сообщения. Даже если программа высокого уровня отправит данные программе на более низком, которая в то же самое время воспользуется импульсом для отправки уведомления программе более высокого уровня, она сможет получить и обработать сообщение с более высокого уровня, так как не будет блокирована.

РубрикиFAQ

Добавить комментарий