Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Параллельные потоки.doc
Скачиваний:
2
Добавлен:
03.09.2019
Размер:
188.93 Кб
Скачать

Параллельные потоки

Последнее обновление: 22 марта 2005

Под словами "параллельный поток" или просто "поток" мы будем понимать объект, выполняемый параллельно с основным потоком приложения и с другими параллельными потоками. Термин "параллельность" рассматривается в контексте вытесняющей многозадачности операционной системы - то есть, операционная система выделяет потоку некоторый квант времени, а затем переключается на другой поток. Параллельный поток может добровольно отдавать часть своего кванта времени, если он переходит в состоянии ожидания некоторого события. Выполнение потока может быть прервано более приоритетным потоком. Момент переключения параллельных потоков и адрес процессорной инструкции в момент переключения будем считать полностью недетеминированными. Реализация параллельных потоков опирается на возможность, предоставляемую операционной системой - "thread". Для именования параллельных потоков в литературе встречаются и другие термины: активные объекты, нити, параллельные процессы. В статье будет рассматриваться только один частный случай использования параллельных потоков - потоки, существующие в пределах одного приложения.

Введение

Не вдаваясь в тонкости реализации, обрисуем вначале одну из проблем, которая возникает при использовании потоков. Представим простейший случай: приложение и один параллельный поток - в приложении создается объект потока и ссылка на него присваивается некоторой переменной приложения. Объект потока может быть уничтожен как со стороны приложения, так и самостоятельно при своем естественном завершении или при завершении по ошибке. Если поток завершился самостоятельно, то ссылка перестанет указывать на объект и попытка последующего уничтожения объекта со стороны приложения приведет в лучшем случае к возникновению исключительной ситуации, а в худшем случае к непредсказуемой ошибке в данных. Для того, чтобы обойти эту ошибку, можно предложить простое решение - объект потока уведомляет приложение о своем завершении. Но, к сожалению, это решение не работает и вот почему. Предположим, что одновременно возникают два события - самостоятельное завершение потока и попытка его завершения со стороны приложения. Приложение еще не получило уведомления и пытается уничтожить поток, который сам находится на этапе уничтожения (например, уведомление посылается из деструктора объекта потока). Другое возможное решение - объекту потока передается указатель на ссылку на самого себя и объект самостоятельно обнуляет эту ссылку при своем завершении. Приложение проверяет ссылку на nil и, если она действительна, то уничтожает поток. Это решение также не работоспособно. Представьте ситуацию, при которой основной поток приложения успешно проверил ссылку, а затем операционная система переключила управление на параллельный поток, который начал самоуничтожение. Приложение считает, что объект потока существует, и при получении управления будет уничтожать только что уничтоженный объект. Вы можете считать такую ситуацию маловероятной, и действительно, в простейшем примере ее вероятность будет исчезающе мала, но в более сложных случаях с многократным созданием-уничтожением потоков и при большом числе потоков этой вероятностью уже никак нельзя пренебречь. Как видно, для решения этой задачи требуется более сложный механизм. Может показаться, что трудности, возникающие при использовании параллельных потоков довольно велики. На самом деле это так и не стоит применять столь мощную технику, как потоки, без особой на то нужды. Но при аккуратном их применении, потоки могут быть чрезвычайно полезными, они могут существенно улучшить внутренний дизайн приложения и сделать приложение более эффективным. При неаккуратном же использовании потоков, ничего, кроме вреда, вы не получите.