Координация потоков

При работе с потоками, на этапе первоначального знакомства с ними, неизбежны ошибки. Особенно неприятны ошибки, связанные с конфликтами потоков, обращающихся к разделяемым ресурсам, а также глобальным переменным. Также иногда бывает необходимо, чтобы потоки работали слаженно Например, после выполнения какого-либо события в одном потоке вам необходимо, чтобы возникало какое-либо постоянное событие в другом потоке. Все это можно объединить общим названием координации потоков. Рассмотрим, как можно эффективно управлять потоками для достижения каких-либо задач.

Для начала определим, какие способы хранения локальных переменных потока нам предоставляет Kylix. Таких способов три.

Первый способ является самым простым, очевидным и самым эффективным. Доступ к локальным переменным, расположенным в стеке потока, самый быстрый.

Рассмотрим два других способа хранения локальных переменных потока. Второй способ проще и эффективнее чем третий (листинг 14.8).

Листинг 14.8.Объявление локальных переменных в потоке класса TThread

type
TMyThread1 = class(TThread)
private
i, j,k,l: integer; // локальные переменные потока типа integer a,b,c: char; // локальные переменные потока типа char
. . .
end;

Эффективность объявления локальных переменных в потомке класса TThread очевидна, т. к. доступ к любому полю объекта осуществляется очень быстро (примерно в 10—11 раз быстрее, чем при использовании описания threadvar).

Третий способ хранения локальных переменных (с помощью threadvar) служит для создания в потоках локальных копий глобальных переменных.

Глобальные переменные могут использоваться всеми потоками приложения, при этом может возникнуть ситуация, когда при изменении глобальной переменной одним потоком происходит изменение этой же глобальной переменной другим потоком. В результате значение, установленное первым потоком, бесследно исчезает, приводя к нежелательным последствиям (в данном примере произойдет обработка ошибочного значения глобальной переменной первым потоком). Для исключения такой ситуации Kylix предлагает средство хранения локальных данных потоков (thread-local storage). С помощью данного средства можно создавать локальные копии глобальных переменных для любого потока. При этом требуется всего лишь заменить одно слово var при объявлении глобальных переменных на слово threadvar:

threadvar
х : integer;

Итак, прочитав эту главу, вы узнали некоторые приемы работы с потоками и научились создавать многопоточные приложения. Это вам особенно пригодится при переносе приложений из среды Windows в Linux.

Hosted by uCoz