Комментарий к программе.
Трансляция программы THREAD2.ASM на Рис.
3.2.3.
Пакет MASM32.
ML /c /coff /DMASM thread2.asm LINK /SUBSYSTEM:WINDOWS thread2.objПакет TASM32.
TASM32 /ml thread2.asm TLINK32 -aa thread2.obj
При нажатии левой кнопки мыши начинается вывод текстовой строки. При нажатии
правой кнопки мыши - выведенная строка стирается. Флаги FLAG1
и
FLAG2
введены для того, чтобы вывод строки и вывод пустой строки
можно было производить только один раз.
Для того чтобы несколько замедлить вывод текста, мы вводим задержку
(Sleep
) в цикл вызова процедуры OUTSTR
в каждом
потоке.
Обратите внимание, что буквы выводятся в окно в основном парами. Объясняется это тем, что пока один из потоков выводит символ, второй уже ждет разрешения, и, как только первый поток выходит из критической секции, второй поток сразу выводит следующий символ.
После в обоих потоках срабатывает задержка (функция Sleep
).
Заключая разговор о критических секциях, отмечу, что это наиболее быстрый способ синхронизации. К минусам данного подхода относится невозможность доступа к секции сразу нескольких потоков, а также отсутствие специальных средств, чтобы подсчитывать число обращений к ресурсу.
Взаимоисключения. Мы не упомянули еще один способ
синхронизации, отложив его подробное описание на следующие главы. Здесь же
отметим, что этот способ называется "взаимоисключением" или мьютексом (Mutex).
Данный способ синхронизации не удобен для работы с потоками, он более пригоден
для процессов. Данный объект создается при помощи функции
CreateMutex
. Все процессы, пытающиеся создать уже созданный объект,
получают дескриптор уже существующего, созданного другим процессом объекта
"взаимоисключение". Особенность данного объекта прежде всего в том, что им может
владеть только один процесс. В документации фирмы Microsoft рекомендуется
использовать данный объект для определения, запущено уже данное приложение или
нет. Но об этом речь пойдет ниже.
41 К слову сказать, в однозадачной операционной системе MS DOS проблема совместного функционирования резидентных программ стояла весьма остро. Не смотря на то, что программисты, их писавшие, добивались весьма больших успехов, все же одновременная работа нескольких резидентных программ часто приводила к весьма заметным конфликтам.