- •1. Потоки. Определение. Области применения
- •2. Необходимость создания потоков
- •3. Функция потока. Создание потока
- •4. Завершение потока
- •5. Возврат управления функцией потока
- •6. Приостановка и возобновление потоков
- •7. Функция Sleep
- •8. Переключение потоков
- •9. Синхронизация потоков
- •9.1. Критические секции
- •Void InitializeCriticalSection(pcritical_section pcs);
- •Void DeleteCriticalSection(pcritical_section pcs);
- •Void EnterCriticalSection(pcritical_section pcs);
- •Void LeaveCriticalSection(pcritical_section pcs);
- •9.2. Правила использования критических секций
- •10. Порядок выполнения работы
- •11. Контрольные вопросы
10. Порядок выполнения работы
-
Создать консольное приложение.
-
Создать поток. Функция потока должна выдавать сообщение о запуске потока. Чтобы поток успел стартовать и вывести сообщение необходимо после его запуска ожидать нажатия клавиши или вызвать задержку.
-
Переделать запуск потока, так чтобы он стартовал в приостановленном состоянии и возобновлялся по нажатию клавиши – 1 и приостанавливался по клавише - 2. Вставить в функцию потока бесконечный цикл внутри, которого выдавать сообщение каждые 500 мс о том, что тот активен. Управление потоком осуществлять из функции main.
-
Передать в функцию потока в качестве параметра адрес строки. Поток должен выводить строку, а также выводить количество заглавных букв в строке. Поместить обработку строки в бесконечный цикл см. предыдущий пункт.
-
Завести второй поток. В функцию второго потока также передавать адрес той же строки, что и функции первого потока. Функция второго потока должна каждые 300 мс менять содержимое строки случайным образом (можно завести несколько вариантов строк одинакового размера и менять их случайным образом).
-
Реализовать управление вторым потоком из функции main: клавиша 3 – приостановка, 4 – возобновление.
-
Поуправлять потоками, посмотреть, как обрабатывается и выводится строка. Реализовать синхронизацию потоков с помощью критической секции, разграничить доступ к строке, то есть сделать так, чтобы пока первый поток выводит строку, второй не мог менять ее. При захвате ресурса каждый поток должен сообщать об этом.
-
Модифицировать программу так, чтобы поток сообщал о том, что ресурс занят другим потоком (только под Windows 2000 – TryEnterCriticalSection).
-
Попробовать добавить в функцию одного из потоков после вызова функции Sleep – вызов SwitchToThread (только под Windows 2000).
-
Расширить возможности управления потоками, так чтобы можно было из функции main убить первый поток – клавиша 5, второй – клавиша 6, запустить первый поток – клавиша 7, второй – клавиша 8.
-
Попробовать остановить один из потоков. Посмотреть и объяснить реакцию программы. Попробовать убить один из потоков, затем вновь создать его. Посмотреть и объяснить реакцию программы.
11. Контрольные вопросы
-
Дайте определение потоку. Для чего используются потоки?
-
Для чего используется функция потока?
-
Какие параметры можно передавать в функцию потока?
-
Как запускаются потоки? Как запустить поток в приостановленном состоянии?
-
Как остановить поток?
-
Как возобновить выполнение потока?
-
Как поток может отказаться от своего кванта времени?
-
В чем состоит проблема синхронизации потоков?
-
Что такое критические секции и для чего они используются?
-
Какие правила необходимо соблюдать при использовании критических секций?