
- •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 и интерфейсные файлы
- •Потоки читателя и писателя
Глава 9. Семафоры. Управление потоками данных Взаимосвязь источник-приемник 70
Семафоры 70
Счетчик больше единицы? "Не вполне критические" секции 72
Новое применение семафоров: управление потоками данных 73
Ограниченный буфер 73
Реализация ограниченного буфера в Delphi 76
Создание: Корректная инициализация счетчиков семафоров 79
Работа: правильные времена ожидания 79
Разрушение: Очистка 80
Разрушение: тонкости остаются 80
Доступ к дескрипторам синхронизации должен быть синхронизован! 81
Управление дескрипторами в Win32 82
Решение 85
Использование ограниченного буфера: пример 89
В завершение... 95
Глава 10. Ввод/вывод и потоки данных: от блокировки к асинхронности и обратно 96
Отличия от потока VCL и разработка интерфейса I/O (ввода/вывода) 96
Обзор 97
Реализация компонента преобразования блокировка-асинхронность 98
Добавление к ограниченному буферу операций просмотра 99
Создание двунаправленного ограниченного буфера 103
Детальное рассмотрение Блокировочно-Асинхронного Буфера (БАБ) 105
Создание БАБ 112
Разрушение БАБ 112
Пример программы с использованием БАБ 113
Мы достигли нашей цели! 117
Заметили утечку памяти? 118
Избавляемся от утечки 118
Проблемы просмотра 118
Промежуточный буфер. 119
Различные ограничения 119
Обратная сторона монеты: Потоковые буферы 120
Глава 11. Синхронизаторы и события (Events). 121
Дополнительные механизмы синхронизации. 121
Как добиться оптимальной эффективности. 121
Простой MREWS. 122
Важные моменты реализации 125
Пример использования простого MREWS 126
Основные операции: 129
Введение в события (Events). 134
Моделирование событий с помощью семафоров. 135
Простой MREWS с использованием событий. 137
Глава 12. Еще о возможностях синхронизации в Win32. 139
Повышенная эффективность с помощью операций взаимоблокировки (interlocked) 139
Атомарность ниоткуда 140
Счетчики событий и секвенсоры 142
Реализация взаимного исключения 142
Ограниченный буфер с одним поставщиком данных и одним потребителем 143
Ограниченный буфер с произвольным числом поставщиков и потребителей 143
Другие возможности синхронизации Win32 144
Глава 13. Использование потоков совместно с bde, Исключениями и dll 145
DLL и многопроцессное программирование 145
Поток и пространство процесса. Однопоточная DLL 145
Написание многопоточных DLL 146
Подключение DLL 147
Западня 1: Энкапсуляция функции точки входа в Delphi 148
Написание многопроцессорной DLL 151
Глобально именованные объекты 154
DLL в деталях 154
Инициализация DLL 154
Приложение с использованием DLL 156
Западня 2: Контекст потока в фунциях точки входа 158
Обработка исключений 161
BDE 162
Глава 14. Проблемы, встретившаяся на практике, и их решение 163
Проблема 163
Решение 163
Пайп DLL и интерфейсные файлы 164
Потоки читателя и писателя 180
© Martin Harvey 2000.
Перевод: © Борис Новгородов, Новосибирск, 2002 г. С любезного разрешения Мартина Харви.
Для сайта http://www.vingrad.ru тексты подготовил Сысоев Александр (Петрович)
Работа над этим руководством продолжается. Если у вас есть вопросы или предложения по стилю, существу темы или оформлению исходного материала (на английском), не стесняйтесь писать автору: martin@pergolesi.demon.co.uk. Если у вас есть вопросы или предложения по стилю, существу темы или оформлению русского перевода, не стесняйтесь писать Петрович'у. Последний вариант руководства можно найти на сайте Мартина Харви (Martin Harvey) или в виде HTML страниц, или как zip-файл.
Благодаря большой работе, проделанной Michael Cessna, доступен также вариант в HTML help формате.
Если связь с этим сайтом медленная, архив имеется и на Borland CodeCentral.
Если вы хотите узнать, чем занимается автор в свободное от написания руководств по программированию время, посетите и другие разделы его сайта.
Перевод в pdf формат осуществил Анатолий Подгорецкий http://www.podgoretsky.com