ВУЗ:
Составители:
Рубрика:
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;
Страницы
- « первая
- ‹ предыдущая
- …
- 16
- 17
- 18
- 19
- 20
- …
- следующая ›
- последняя »