Ассемблер для Windows

Пример синхронизации двух потоков посредством критической секции



Рисунок 3.2.3. Пример синхронизации двух потоков посредством критической секции.

Комментарий к программе.

Трансляция программы 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).

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



Содержание раздела