- •Министерство образования и науки российской федерации федеральное агентство по образованию
- •Кафедра систем автоматизированного проектирования
- •Введение
- •1.2.2. Пользовательский интерфейс
- •1.2.3. Файловые системы
- •1.3. Порядок выполнения работы
- •1.4. Содержание отчета
- •Цель работы.
- •1.5. Контрольные вопросы и задания
- •2. Лабораторная работа № 2 «Утилиты ос Windows xp»
- •2.1. Цель работы:
- •2.2. Теоретическая часть
- •2.2.1. Программа получения сведений о системе
- •2.2.2. Программа архивации данных
- •2.2.3. Программа проверки диска
- •2.2.4. Программа дефрагментации дисков
- •2.2.5. Программа очистки жесткого диска
- •2.2.6. Программа «Восстановление системы»
- •2.3. Порядок выполнения работы
- •2.4. Содержание отчета
- •2.5. Контрольные вопросы и задания
- •3.2.2. Команды для работы с файлами и папками
- •3.2.3. Внутренние команды
- •3.2.4. Команды (поддержки) пакетных файлов
- •If exist *.Rpt echo Отчет получен.
- •3.3. Порядок выполнения работы
- •3.4. Содержание отчета
- •Цель работы.
- •3.5. Контрольные вопросы и задания
- •4. Лабораторная работа № 4 «Настройка и оптимизация среды Windows xp»
- •4.1. Цель работы:
- •4.2. Теоретическая часть
- •4.2.1. Индивидуальная настройка рабочего стола
- •4.2.2. Диспетчер задач (Task Manager)
- •4.2.3. Планировщик заданий (Task Scheduler)
- •4.2.4. Средства поддержки виртуальной памяти
- •4.2.5. Другие средства оптимизации
- •4.3. Порядок выполнения работы
- •4.4. Содержание отчета
- •Цель работы.
- •4.5. Контрольные вопросы и задания
- •5.2.2. Синхронизация потоков
- •5.2.3. Создание многопоточных приложений
- •5.2.4. Синхронизация порожденного потока с родительским
- •5.2.5. Управление приоритетом обслуживания потока
- •5.2.6. Приостановка и продолжение работы потока
- •5.3. Порядок выполнения работы
- •5.4. Содержание отчета
- •Цель работы.
- •5.5. Контрольные вопросы и задания
- •Приложение 1. Оформление отчета по лабораторной работе
- •1. Цель работы.
- •Приложение 2. Оформление реферата по выбранной теме
- •Приложение 3. Фрагменты текста программы
- •Void __fastcall Synhr1();// вызывается
- •Void __fastcall Synhr2();// вызывается
- •Int X,y; // Хранит координаты шарика
- •Библиографический список (Учебники и учебные пособия)
- •(Общие вопросы)
- •(Графический интерфейс пользователя)
- •(Семейство Windows)
5.2.2. Синхронизация потоков
Многопоточный режим работы открывает новые возможности для программистов, однако за эти возможности приходится расплачиваться усложнением процесса разработки и отладки приложений. Основная трудность, с которой сталкиваются программисты, никогда не создававшие ранее многопоточные приложения, это синхронизация одновременно работающих потоков. Для чего и когда она нужна?
Однопоточная программа (например, программа MS-DOS) при запуске получает в монопольное распоряжение все ресурсы компьютера. Так как в однопоточной системе существует только один процесс, он использует эти ресурсы в той последовательности, которая соответствует логике работы программы. Процессы и потоки, работающие одновременно в многопоточной системе, могут пытаться обращаться одновременно к одним и тем же ресурсам, что может привести к неправильной работе приложений. Поясним это на простом примере.
Пусть мы создаем программу, выполняющую операции с банковским счетом. Операция снятия некоторой суммы денег со счета может происходить в следующей последовательности:
на первом шаге проверяется общая сумма денег, которая хранится на счете;
если общая сумма равна или превышает размер снимаемой суммы денег, общая сумма уменьшается на необходимую величину;
значение остатка записывается на текущий счет.
Если операция уменьшения текущего счета выполняется в однопоточной системе, то никаких проблем не возникнет. Однако представим себе, что два процесса пытаются одновременно выполнить только что описанную операцию с одним и тем же счетом. Пусть при этом на счету находится 5 млн. рублей, а оба процесса пытаются снять с него по 3 млн. рублей.
Допустим, события разворачиваются следующим образом:
первый процесс проверяет состояние текущего счета и убеждается, что на нем хранится 5 млн. рублей;
второй процесс проверяет состояние текущего счета и также убеждается, что на нем хранится 5 млн. рублей;
первый процесс уменьшает счет на 3 млн. рублей и записывает остаток (2 млн. рублей) на текущий счет;
второй процесс выполняет ту же самую операцию, так как после проверки считает, что на счету по-прежнему хранится 5 млн. рублей.
В результате получилось, что со счета, на котором находилось 5 млн. рублей, было снято 6 млн. рублей, и при этом там осталось еще 2 млн. рублей. Итого, банку нанесен ущерб в 3 млн. рублей.
Как же составить программу уменьшения счета, чтобы она не позволяла совершать подобные ошибки? На время выполнения операций над счетом одним процессом необходимо запретить доступ к этому счету со стороны других процессов. В этом случае сценарий работы программы должен быть следующим:
процесс блокирует счет для выполнения операций другими процессами, получая его в монопольное владение;
процесс проводит процедуру уменьшения счета и записывает на текущий счет новое значение остатка;
процесс разблокирует счет, разрешая другим процессам выполнение операций.
Когда первый процесс блокирует счет, тот становится недоступен другим процессам. Если второй процесс также попытается заблокировать этот же счет, он будет переведен в состояние ожидания. Когда первый процесс уменьшит счет и на нем останется 2 млн. долларов, второй процесс будет разблокирован. Он проверит остаток, убедится, что сумма недостаточна и не будет проводить операцию.
Таким образом, в многопоточной среде необходима синхронизация потоков при обращении к критическим ресурсам. Если над такими ресурсами будут выполняться операции в неправильной последовательности, это приведет к возникновению трудно обнаруживаемых ошибок.