Создание многопоточных приложений. Копытин А.В - 16 стр.

UptoLike

Составители: 

16
параметром dwMilliseconds. Вставка
вызова этой процедуры в данный код
обусловлена необходимостью создания эффекта имитации условий, когда сис-
тема работает в режиме большей многозадачности , а также необходимостью
внесения в приложение случайностей , связанных с тем, когда и какой именно
поток будет выполняться .
Синхронизация потоков
При работе с несколькими потоками вам часто придется синхронизировать
доступ потоков к определенным данным или ресурсам . Предположим, у вас
есть приложение, в котором один поток используется для чтения файла в па-
мять , а другой для подсчета количества символов в файле . Само собой разу-
меется , что до тех пор, пока файл полностью не загрузится в память , вы не
сможете сосчитать в нем все символы . Но поскольку каждая операция выпол-
няется в своем собственном потоке, операционная система вольна обращаться с
ними как с двумя совершенно несвязанными задачами. Чтобы справиться с этой
проблемой, необходимо синхронизировать эти два потока таким образом, что -
бы поток, подсчитывающий символы , не начинал работать , пока не завершится
поток, загружающий файл.
В Win32 предусмотрены различные способы решения проблем, связанных с
синхронизацией потоков: критические разделы (critical sections), мьютексы
(mutexes), семафоры (semaphors) и события (events). Здесь вы найдете примеры
использования критических разделов и событий.
В чем же состоит суть проблемы , требующей синхронизации потоков? Для
иллюстрации предположим, что у вас есть массив целых, который нужно ини -
циализировать восходящими значениями. Сначала вы хотите «пройти» по мас-
сиву и установить значения от 1 до 128, а затем переинициализировать этот
массив значениями от 128 до 255. После этого вы отображаете финальный по -
ток в окне списка. Эта задача может быть решена путем выполнения инициали -
заций в двух отдельных потоках . Попытка реализовать этот подход показана в
коде модуля , представленного в листинге 3.
Листинг 3. Модуль, в котором реализована попытка инициализировать
массив в потоках
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMainForm = class(TForm)
Buttonl: TButton;
ListBoxl: TListBox;
procedure ButtonlClick(Sender: TObject);
private
procedure ThreadsDone(Sender: TObject);
end;
                                        16
параметро м dwMilliseconds. В ставка вы зо ва этой про цедуры в данны й ко д
о бусло влена нео бх о димо стью со здания эффекта имитации усло вий, ко гда сис-
тема рабо таетв реж име бо льш ей мно го задачно сти, а такж е нео бх о димо стью
внесения в прило ж ение случайно стей, связанны х с тем, ко гда и како й именно
по ток будетвы по лняться.

С и н хрон и заци я п от оков
   П ри рабо те с неско лькими по токами вам часто придется синх ро низиро вать
до ступ по токо в к о пределенны м данны м или ресурсам. П редпо ло ж им, у вас
есть прило ж ение, в ко торо м о дин по ток испо льзуется для чтения файла в па-
мять, а друго й – для по дсчета ко личества симво ло в в файле. С амо со бо й разу-
меется, что до тех по р, по ка файлпо лно стью не загрузится в память, вы не
смо ж ете со считать в нем все симво лы . Н о по ско льку каж дая о перация вы по л-
няется всво ем со бственно м по токе, о перацио нная системаво льнао бращ аться с
ними как сдвумя со верш енно несвязанны ми задачами. Ч тобы справиться сэтой
про блемо й, нео бх о димо синх ро низиро вать эти два по тока таким о бразо м, чт о-
бы по ток, по дсчиты ваю щ ий симво лы , не начиналрабо тать, по кане заверш ится
по ток, загруж аю щ ий файл.
   В Win32 предусмо трены различны е спо со бы реш ения про блем, связанны х с
синх ро низацией по токо в: критические разделы (critical sections), мью тексы
(mutexes), семафо ры (semaphors) и со бы тия (events). Здесьвы найдете примеры
испо льзо вания критических раздело ви со бы тий.
   В чем ж е со стоитсуть про блемы , требую щ ей синх ро низации по токо в? Д ля
иллю страции предпо ло ж им, что у вас есть массив целы х , ко торы й нуж но ини-
циализиро вать во сх о дящ ими значениями. С начала вы х о тите «про йти» по мас-
сиву и устано вить значения о т1 до 128, а затем переинициализиро вать этот
массив значениями о т128 до 255. П о сле этого вы о тображ аете финальны й по -
ток во кне списка. Э тазадачамо ж етбы тьреш енапутем вы по лнения инициали-
заций в двух о тдельны х по токах . П о пы тка реализо вать этотпо дх о д по казана в
ко демо дуля, представленно го влистинге3.
Ли с т и н г 3. М одуль, в кот ором реали зован а п оп ы т ка и н и ци али зи роват ь
м ас с и в в п от оках
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TMainForm = class(TForm)
    Buttonl: TButton;
    ListBoxl: TListBox;
    procedure ButtonlClick(Sender: TObject);
  private
    procedure ThreadsDone(Sender: TObject);
  end;