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

UptoLike

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

18
Поскольку оба потока выполняются одновременно , при инициализации
массива происходит искажение равномерности возрастания значений его эле -
ментов. Чтобы убедиться в этом, взгляните на результат работы этой програм -
мы , показанный на рис. 2.
Рис . 2. Результат несинхронизированной инициализации массива
Решение этой проблемы лежит в синхронизации двух потоков во время их
доступа к глобальному массиву, чтобы они не исчезали из виду в одно и то же
время. Но к реализации решения этой проблемы можно подойти по - разному.
Критические разделы
Критические разделы (critical sections) предоставляют один из самых про -
стых способов синхронизации потоков. Критический раздел это некоторый
раздел кода, который может выполняться одновременно только одним потоком.
Если код, используемый для инициализации массива, поместить в критический
раздел, то другие потоки не смогут войти в этот раздел кода до тех пор, пока
первый поток не завершит его выполнение. Для работы с критическими разде-
лами в Delphi предусмотрен специальный класс TcriticalSection.
В листинге 4 демонстрируется способ синхронизации инициализирующих
массив потоков с помощью критических разделов.
Листинг 4. Использование критических разделов
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMainForm = class(TForm)
Buttonl: TButton;
ListBoxl: TListBox;
                                               18
  П о ско льку о ба по тока вы по лняю тся о дно временно , при инициализации
массива про исх о дитискаж ение равно мерно сти во зрастания значений его эле-
ментов. Ч тобы убедиться в этом, взгляните на результатрабо ты этой про грам-
мы , по казанны й нарис. 2.




             Р ис . 2. Р езульт ат нес инхр онизир ованнойиниц иализац ии м ас с ива

   Реш ение этой про блемы леж итв синх ро низации двух по токо в во время их
до ступа к гло бально му массиву, чтобы о ни не исчезали из виду в о дно и то ж е
время. Н о к реализации реш ения этой про блемы мо ж но по до йти по -разно му.

Кри т и чес ки е разделы
   Кр ит ичес кие р азделы (critical sections) предо ставляю то дин из самы х про -
сты х спо со бо в синх ро низации по токо в. Критический раздел– это неко торы й
разделко да, ко торы й мо ж етвы по лняться о дно временно только о дним по токо м.
Е сли ко д, испо льзуемы й для инициализации массива, по местить в критический
раздел, то другие по токи не смо гутво йти в этотразделко да до тех по р, по ка
первы й по ток не заверш итего вы по лнение. Д ля рабо ты с критическими разде-
лами вDelphi предусмо трен специальны й классTcriticalSection.
   В листинге 4 демо нстрируется спо со б синх ро низации инициализирую щ их
массивпо токо вспо мо щ ью критических раздело в.
Ли с т и н г 4. Ис п ользован и е кри т и чес ки х разделов
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TMainForm = class(TForm)
    Buttonl: TButton;
    ListBoxl: TListBox;