Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций СПО 31-8-13.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
970 Кб
Скачать
☆

Использование потоков при разработке приложений

Большинство приложений обходятся единственным, первичным потоком.

Использование дополнительных потоков позволяет добиться минимального простоя процессора. За счет чего?

  1. За счет переключения на другой поток во время пауз между вводом символов с клавиатуры;

  2. За счет времени ожидания данных от внешних устройств.

Пример 1. В электронных таблицах нужно пересчитывать данные при изменении пользователем содержимого ячеек. Для этого можно выделить блок расчетов в отдельный поток. Пока пользователь вводит данные - расчет не ведется. Пауза - работает поток более высокого приоритета – выполняется пересчет.

Пример 2. – Текстовый процессор. Дополнительный поток используется для разбивки введенного документа на страницы.

Пример 3. При выполнении операций, отнимающих длительное время (копирование файлов) можно открыть диалоговое окно кнопкой «отмена» (допустим пользователь передумал или копирует не тот файл). Копирование должно выполняться отдельным потоком.

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

Влияние приоритета потока на время его выполнения

Поток получает время ЦП в соответствии с его приоритетом – чем выше приоритет, тем больше времени он получает боле высокий приоритет потока ещё не означает, что приложение в целом станет работать быстрее. Существенное влияние оказывает загрузка процессора.

1.3.3 Синхронизация взаимодействующих потоков

Независимые и взаимодействующие потоки

Потоки делятся на независимые (параллельные) и взаимодействующие.

Взаимодействовать могу конкурирующие потоки (имеющие доступ к общим переменным) и сотрудничающие потоки (реализующие схему «поставщик-потребитель»).

Пример 1: Два потока одного приоритета увеличивают значение общей переменной global следующим образом:

Поток 1

Поток 2

x:=global

x:=global

x:=x+1

x:=x+1

global:=x

global:=x

Если сначала работает поток 1, потом – 2, то в итоге переменная global увеличится на 2. если произойдет прерывание потока 1, то в итоге переменная global увеличится на 1.

Решения:

1. (global);

2. interlocked (increment(global)).

Критические участки

Если более чем один поток используют общие данные (переменная, массив, запись файла), возможны искажения данных. Эти искажения возникают, если потоки выполняют запись значений в совместно используемую переменную.

Если один поток использует критический ресурс, то другие потоки не должны его использовать, а должны быть переведены ОС в состояние блокировки.

Условный пример: Два потока имеют доступ к одному и тому же файлу.

Рисунок 1 -7

Поток 1: открывает запись, пишет в поля 1-4, и его квант времени заканчивается.

Поток 2: изменяет поля5-6, записывает изменения.

Поток 1: из буфера пишет в базу, и изменения, сделанные потоком 2, уничтожаются.

Другой, более наглядный и более простой пример: Два потока, переменная global: word; начальное значение переменной равно 100, каждый поток пытается увеличить значение переменной global на 1, следующим образом:

For I: =1 to 10 do

Begin

Sleep(5);

I: =global;

I: =i+1;

запись в ListBox1 I;

Global: =I;

end;

Поток 2 также имеет:

For I; =1 to 10 do

Begin

Sleep (2);

I: =global;

I: =i+1;

запись в ListBox2 I;

Global: =I;

end;

Будет ли в итоге global=120, если потоки стартуют одновременно?

Если поток 1 берет I:=102, прибавляет 1, будет 103, квант истек.

Поток 2 берет I:=102, прибавляет 1, запишет 103, поток 1 запишет 103. в обоих случаях могут быть разные значения, единица потеряна!

Простейшее решение – inc(global).