
- •Multithreading - The Delphi Way. Многопоточность - как это делается в Дельфи.
- •Глава 8. Потокобезопасные классы в Дельфи и приоритеты 62
- •Глава 9. Семафоры. Управление потоками данных Взаимосвязь источник-приемник 70
- •Глава 10. Ввод/вывод и потоки данных: от блокировки к асинхронности и обратно 96
- •Глава 11. Синхронизаторы и события (Events). 121
- •Глава 12. Еще о возможностях синхронизации в Win32. 139
- •Глава 13. Использование потоков совместно с bde, Исключениями и dll 145
- •Глава 14. Проблемы, встретившаяся на практике, и их решение 163
- •Введение.
- •Посвящения.
- •Определения
- •Разделение времени
- •Для чего используют потоки?
- •Глава 2. Создание потока в Delphi. Предисловие с диаграммой.
- •Наш первый не vcl поток
- •Что именно делает эта программа?
- •Проблемы и сюрпризы.
- •Проблемы запуска.
- •Проблемы взаимодействия
- •Проблемы завершения
- •Глава 3. Основы синхронизации. Как разделять данные между потоками?
- •Атомарность при доступе к общим данным
- •Дополнительные проблемы с vcl
- •Многопроцессорные машины.
- •Решение для Delphi: tThread.Synchronize.
- •Как это работает? Что делает Synchronize?
- •Синхронизация для не-vcl потоков.
- •Глава 4. Простое разрушение потока Проблемы завершения, остановки и разрушения потоков
- •Досрочная остановка потока
- •Событие OnTerminate.
- •Контролируемая остановка потока - Подход 1.
- •Глава 5. Снова о разрушении потока. Тупик или зацикливание (Deadlock) Метод WaitFor
- •Контролируемое завершение потока - Подход 2
- •Введение в обработку сообщений и отложенное уведомление
- •WaitFor может вызвать долгую задержку
- •Вы заметили ошибку? WaitFor и Synchronize: зацикливание
- •Как избежать такого тупика
- •Глава 6. Снова о синхронизации: Критические секции и мьютексы Ограничения Synchronize
- •Критические секции
- •Что это все значит для Delphi-программиста?
- •На заметку
- •Могут ли данные пропасть или остаться недоступными в буфере?
- •Как насчет запоздавших сообщений (out of date)?
- •Проблемы Flow Control и неэффективность списка
- •Мьютексы
- •Глава 7. Программирование с использованием мьютексов. Управление конкуренцией Пора позаботиться о стиле?
- •Тупик из-за упорядочения мьютексов
- •Избавляемся от зацикливания потоков путем ожидания
- •Избавляемся от зацикливания, устанавливая упорядочение захвата мьютексов
- •Из огня да в полымя!
- •Избавляемся от зацикливания "ленивым способом", давая Win32 сделать это за нас
- •Атомарность составных операций - управление конкуренцией оптимистическим и пессимистическим образом
- •Оптимистическое управление
- •Пессимистическое управление
- •Избавляемся от недостатков в схеме блокировки
- •Еще не все ясно? Можно и попроще!
- •Глава 8. Потокобезопасные классы в Дельфи и приоритеты Для чего писать потокобезопасные классы?
- •Типы потокобезопасных классов.
- •Потокобезопасная инкапсуляция или наследники существующих классов
- •Классы управления потоками данных
- •Мониторы
- •Классы Interlock (взаимоблокировки)
- •Поддержка потоков в vcl
- •Руководство разработчика потокобезопасных классов
- •Управление приоритетами
- •Что такое приоритет? Как это делается в Win32
- •Какой приоритет дать моему потоку?
- •Глава 9. Семафоры. Управление потоками данных Взаимосвязь источник-приемник Семафоры
- •Счетчик больше единицы? "Не вполне критические" секции
- •Новое применение семафоров: управление потоками данных
- •Ограниченный буфер
- •Реализация ограниченного буфера в Delphi
- •Создание: Корректная инициализация счетчиков семафоров
- •Работа: правильные времена ожидания
- •Разрушение: Очистка
- •Разрушение: тонкости остаются
- •Доступ к дескрипторам синхронизации должен быть синхронизован!
- •Управление дескрипторами в Win32
- •Решение
- •Использование ограниченного буфера: пример
- •В завершение...
- •Глава 10. Ввод/вывод и потоки данных: от блокировки к асинхронности и обратно Отличия от потока vcl и разработка интерфейса I/o (ввода/вывода)
- •Реализация компонента преобразования блокировка-асинхронность
- •Добавление к ограниченному буферу операций просмотра
- •Создание двунаправленного ограниченного буфера
- •Детальное рассмотрение Блокировочно-Асинхронного Буфера (баб)
- •Создание баб
- •Разрушение баб
- •Пример программы с использованием баб
- •Мы достигли нашей цели!
- •Заметили утечку памяти?
- •Избавляемся от утечки
- •Проблемы просмотра
- •Промежуточный буфер.
- •Различные ограничения
- •Обратная сторона монеты: Потоковые буферы
- •Глава 11. Синхронизаторы и события (Events). Дополнительные механизмы синхронизации.
- •Как добиться оптимальной эффективности.
- •Простой mrews.
- •Важные моменты реализации
- •Пример использования простого mrews
- •Основные операции:
- •Введение в события (Events).
- •Моделирование событий с помощью семафоров.
- •Простой mrews с использованием событий.
- •Глава 12. Еще о возможностях синхронизации в Win32. Повышенная эффективность с помощью операций взаимоблокировки (interlocked)
- •Атомарность ниоткуда
- •Счетчики событий и секвенсоры
- •Реализация взаимного исключения
- •Ограниченный буфер с одним поставщиком данных и одним потребителем
- •Ограниченный буфер с произвольным числом поставщиков и потребителей
- •Другие возможности синхронизации Win32
- •Глава 13. Использование потоков совместно с bde, Исключениями и dll dll и многопроцессное программирование
- •Поток и пространство процесса. Однопоточная dll
- •Написание многопоточных dll
- •Подключение dll
- •Западня 1: Энкапсуляция функции точки входа в Delphi
- •Написание многопроцессорной dll
- •Глобально именованные объекты
- •Dll в деталях
- •Инициализация dll
- •Приложение с использованием dll
- •Западня 2: Контекст потока в фунциях точки входа
- •Обработка исключений
- •Глава 14. Проблемы, встретившаяся на практике, и их решение Проблема
- •Решение
- •Пайп dll и интерфейсные файлы
- •Потоки читателя и писателя
Martin Harvey Многопоточность - как это делается в Дельфи
Multithreading - The Delphi Way. Многопоточность - как это делается в Дельфи.
Martin Harvey.
Version 1.1a
Содержание.
Введение. 6
Посвящения. 7
Рекомендуемая литература 8
Навигация. 9
История изменений 10
Благодарности. 11
Глава 1. Что такое потоки (threads)? Для чего их использовать? 12
Из истории. 12
Определения 12
Пример 13
Разделение времени 13
Для чего используют потоки? 13
Глава 2. Создание потока в Delphi. 15
Предисловие с диаграммой. 15
Наш первый не VCL поток 17
Что именно делает эта программа? 18
Проблемы и сюрпризы. 19
Проблемы запуска. 20
Проблемы взаимодействия 20
Проблемы завершения 20
Глава 3. Основы синхронизации. 23
Как разделять данные между потоками? 23
Атомарность при доступе к общим данным 23
Дополнительные проблемы с VCL 24
Многопроцессорные машины. 25
Решение для Delphi: TThread.Synchronize. 25
Как это работает? Что делает Synchronize? 26
Синхронизация для не-VCL потоков. 27
Глава 4. Простое разрушение потока 29
Проблемы завершения, остановки и разрушения потоков 29
Досрочная остановка потока 29
Событие OnTerminate. 31
Контролируемая остановка потока - Подход 1. 32
Глава 5. Снова о разрушении потока. Тупик или зацикливание (Deadlock) 34
Метод WaitFor 34
Контролируемое завершение потока - Подход 2 34
Введение в обработку сообщений и отложенное уведомление 37
WaitFor может вызвать долгую задержку 39
Вы заметили ошибку? WaitFor и Synchronize: зацикливание 40
Как избежать такого тупика 41
Глава 6. Снова о синхронизации: Критические секции и мьютексы 43
Ограничения Synchronize 43
Критические секции 44
Что это все значит для Delphi-программиста? 46
На заметку 50
Могут ли данные пропасть или остаться недоступными в буфере? 50
Как насчет запоздавших сообщений (out of date)? 50
Проблемы Flow Control и неэффективность списка 51
Мьютексы 52
Глава 7. Программирование с использованием мьютексов. Управление конкуренцией 53
Пора позаботиться о стиле? 53
Тупик из-за упорядочения мьютексов 53
Избавляемся от зацикливания потоков путем ожидания 54
Избавляемся от зацикливания, устанавливая упорядочение захвата мьютексов 54
Из огня да в полымя! 57
Избавляемся от зацикливания "ленивым способом", давая Win32 сделать это за нас 57
Атомарность составных операций - управление конкуренцией оптимистическим и пессимистическим образом 58
Оптимистическое управление 58
Пессимистическое управление 59
Избавляемся от недостатков в схеме блокировки 60
Еще не все ясно? Можно и попроще! 61
Глава 8. Потокобезопасные классы в Дельфи и приоритеты 62
Для чего писать потокобезопасные классы? 62
Типы потокобезопасных классов. 62
Потокобезопасная инкапсуляция или наследники существующих классов 62
Классы управления потоками данных 63
Мониторы 63
Классы Interlock (взаимоблокировки) 64
Поддержка потоков в VCL 64
TThreadList 64
TSychroObject 64
TEvent и TSimpleEvent 65
TMultiReadExclusiveWriteSynchroniser 65
Руководство разработчика потокобезопасных классов 66
Управление приоритетами 66
Что такое приоритет? Как это делается в Win32 67
Какой приоритет дать моему потоку? 68