![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Поток без синхронизацииDelphi , Компоненты и Классы , ПотокиАвтор: Xavier Pacheco unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMainForm = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private procedure ThreadsDone(Sender: TObject); end; TFooThread = class(TThread) protected procedure Execute; override; end; var MainForm: TMainForm; implementation {$R *.DFM} const MaxSize = 128; var NextNumber: Integer = 0; DoneFlags: Integer = 0; GlobalArray: array[1..MaxSize] of Integer; function GetNextNumber: Integer; begin Result := NextNumber; // return global var Inc(NextNumber); // inc global var end; procedure TFooThread.Execute; var i: Integer; begin OnTerminate := MainForm.ThreadsDone; for i := 1 to MaxSize do begin GlobalArray[i] := GetNextNumber; // set array element Sleep(5); // let thread intertwine end; end; procedure TMainForm.ThreadsDone(Sender: TObject); var i: Integer; begin Inc(DoneFlags); if DoneFlags = 2 then // make sure both threads finished for i := 1 to MaxSize do { fill listbox with array contents } Listbox1.Items.Add(IntToStr(GlobalArray[i])); end; procedure TMainForm.Button1Click(Sender: TObject); begin TFooThread.Create(False); // create threads TFooThread.Create(False); end; end. Это проект Delphi, демонстрирующий использование нескольких потоков без синхронизации. Программа создает два потока, Обзор кода:
Проблема с этим кодом заключается в том, что он не синхронизирует доступ к общим ресурсам (массиву и списку). Это означает, что потоки могут перезаписать изменения друг друга,leading to incorrect results. Чтобы решить эту проблему, можно использовать синхронизационные примитивы, такие как критические секции, семафоры или блоки для защиты доступа к общим ресурсам. Например, можно обернуть код в процедуре
Альтернативно, можно использовать блок для защиты доступа к общим ресурсам:
Также стоит отметить, что использование потоков без синхронизации может привести к неожиданным поведениям и ошибкам. В целом рекомендуется использовать синхронизационные примитивы при доступе к общим ресурсам из нескольких потоков. Альтернативным решением является использование конкуретного данных, таких как
В этом примере В статье описывается пример использования потоков без синхронизации в Delphi, где два потока изменяют общую переменную и заполняют массивом, а затем результаты выводятся в список. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |