Комментарии к примеру простой системы "производитель/потребитель"

Комментарии к примеру простой системы "производитель/потребитель"

Этот пример иллюстрирует некоторые моменты и соглашения, касающиеся программирования, которые будут важны для нас на протяжении этой и последующих глав.

• Объект CRITICAL_SECTION является частью объекта (блока сообщения), защиту которого он обеспечивает.

• Каждый доступ к сообщению осуществляется на критическом участке кода.

• Типом переменных, доступ к которым осуществляется разными потоками, является volatile.

• Использование обработчиков завершения гарантирует, что объекты CS будут обязательно освобождены. Хотя в данном случае эта методика и не является для нас существенной, она дополнительно гарантирует, что вызов функции LeaveCriticalSection не будет случайно опущен впоследствии при изменении кода программы. Имейте также в виду, что обработчик завершения ограничен использованием средств С, и его не следует использовать совместно с C++.

• Функции MessageFill и MessageDisplay вызываются лишь на критических участках кода и используют для нужд своих вычислений не глобальную, а локальную память. Кстати, обе они будут применяться и в последующих примерах, но их листинги больше приводиться не будут.

• Не существует удобного способа, при помощи которого поток производителя мог бы известить поток потребителя о наличии нового сообщения, и поэтому поток потребителя должен просто ожидать, пока не будет установлен флаг готовности, который используется для индикации появления нового сообщения. Устранить этот недостаток нам помогут объекты событий ядра.

• Одним из инвариантных свойств, которые гарантируются этой программой, является то, что контрольная сумма блока сообщения будет всегда корректной вне критических участков кода. Другим инвариантным свойством является следующее:

0 <= nLost + nCons <= sequence

Об этом важном свойстве далее еще будет идти речь.

• О необходимости прекращения передачи поток производителя узнает лишь после проверки флага, устанавливаемого в блоке сообщения потока потребителя. Поскольку потоки не могут обмениваться между собой никакими сигналами, а вызов функции TerminateThread чреват нежелательными побочными эффектами, эта методика является простейшим способом остановки другого потока. Разумеется, чтобы эта методика была эффективной, работа потоков должна быть скоординированной. В то же время, подобное решение требует, чтобы поток не блокировался, иначе он не сможет тестировать флаг; способы решения проблемы блокированных потоков обсуждаются в главе 10.

Объекты CRITICAL_SECTION предоставляют в наше распоряжение мощный механизм синхронизации, но, тем не менее, они не в состоянии обеспечить всю полноту необходимых функциональных возможностей. О невозможности отправки сигналов одним потоком другому уже говорилось, кроме того, эти объекты не позволяют воспользоваться конечными интервалами ожидания (time-out). Объекты синхронизации ядра Windows позволяют снизить остроту не только этих, но и других ограничений.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.1.8. Предполагаемый потребитель

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

3.1.8. Предполагаемый потребитель Дизайн той или иной операционной системы прямо зависит от ее потребителя. Некоторые операционные системы предназначены для лабораторий, другие — для настольных компьютеров. Одни системы разрабатываются для технических специалистов,


3.1.8. Предполагаемый потребитель

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

3.1.8. Предполагаемый потребитель Дизайн той или иной операционной системы прямо зависит от ее потребителя. Некоторые операционные системы предназначены для лабораторий, другие — для настольных компьютеров. Одни системы разрабатываются для технических специалистов,


Простой класс

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Простой класс Что представляет собой класс можно выяснить, изучая простой, но типичный пример, который демонстрирует фундаментальные свойства, применимые практически ко всем


7.3. Схема производитель-потребитель

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

7.3. Схема производитель-потребитель Одна из классических задач на синхронизацию называется задачей производителя и потребителя. Она также известна как задача ограниченного буфера. Один или несколько производителей (потоков или процессов) создают данные, которые


10.9. Несколько производителей, один потребитель

Из книги Системное программирование в среде Windows автора Харт Джонсон М

10.9. Несколько производителей, один потребитель Решение в разделе 10.6 относится к классической задаче с одним производителем и одним потребителем. Новая, интересная модификация программы позволит нескольким производителям работать с одним потребителем. Начнем с решения


Комментарии к примеру с таймером ожидания

Из книги Цифровой журнал «Компьютерра» № 207 автора Журнал «Компьютерра»

Комментарии к примеру с таймером ожидания Исходя из типа таймера и используя либо процедуру завершения, либо ожидание перехода дескриптора в сигнальное состояние, можно образовать четыре различных комбинации. Программа 14.3 иллюстрирует использование процедуры


19.5.1. Простой пример

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид


Производитель Gorilla Glass обещает выпустить антибактериальный экран Николай Маслухин

Из книги Linux Mint и его Cinnamon. Очерки применителя автора Федорчук Алексей Викторович

Производитель Gorilla Glass обещает выпустить антибактериальный экран Николай Маслухин Опубликовано 08 января 2014 Помните, в прошлом году, аккурат на католическое Рождество, мы писали о дезинфицирующем кейсе для смартфонов PhoneSoap? Создатели как раз


Fitbit, производитель фитнес-браслетов, отзывает одну из моделей из-за аллергии Николай Маслухин

Из книги Linux и все, все, все... Статьи и колонки в LinuxFormat, 2006-2013 автора Федорчук Алексей Викторович

Fitbit, производитель фитнес-браслетов, отзывает одну из моделей из-за аллергии Николай Маслухин Опубликовано 24 февраля 2014 Носимая электроника только-только зарождается как класс самостоятельных устройств. Поэтому производители пока не в


18.7.1. Простой цикл while

Из книги автора

18.7.1. Простой цикл while Ниже приводится основная форма цикла while. Условие тестирования состоит в том, что если "COUNTER is less than 5", условие останется истинным. Переменная counter имеет начальное значение нуль, и ее значение увеличивается на постоянную величину при выполнении цикла.$ pg


Создаём простой пул

Из книги автора

Создаём простой пул Освоив ранее основные понятия, мы научились понимать ZFS. Для обратной же задачи — чтобы ZFS понимала нас — нужно ознакомиться с её командами. Главные из них — две: zpool для создания и управления пулами, и zfs для создания и управления наборами данных.


Создаём простой пул

Из книги автора

Создаём простой пул Освоив ранее основные понятия, мы научились понимать ZFS. Для обратной же задачи – чтобы ZFS понимала нас – нужно ознакомиться с её командами. Главные из них – две: zpool для создания и управления пулами, и zfs для создания и управления наборами данных.