想问个多线程中变量互斥的问题(30分)

  • 主题发起人 主题发起人 yhl1118
  • 开始时间 开始时间
Y

yhl1118

Unregistered / Unconfirmed
GUEST, unregistred user!
我有多个线程要对一个全局变量进行操作,为了避免同时修改该变量,所以我想可能要
对该变量进行互斥定义,请问我要如何做?
 
在Sysncobjs中有几个类,但没有互斥体,如果只是避免同时修改该变量可以用它们。
 
以下是我初学线程过程中做的一个程序,是用互斥实现的,此外,还可以用阻塞实现,有
兴趣的话,可以把源程序发给你。
测试以下程序,需要一个form,一个listbox,一个按钮button1,你可以尝试把互斥去掉,看
看有什么不同
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,FileCtrl;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
ComboBox1: TComboBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure ThreadDone(Sender: Tobject);
public

{ Public declarations }
end;

//定义线程
TFooThread = class(TThread)
protected
procedure execute;override;
end;

var
Form1: TForm1;

implementation
{$R *.DFM}
const MaxSize=128;
var
NextNumber:integer=0;
do
neFlags:integer=0;
GlobalArray:array[1..MaxSize] of integer;
hMutex:Thandle=0;//互斥对象

{ TFooThread }
function GetNextNumber: integer;
begin
Result:=NextNumber;
inc(nextNumber);
end;

procedure TFooThread.execute;
var
i:integer;
begin
onTerminate:=Form1.ThreadDone;
if WaitForSingleObject(hMutex,INFINITE)=WAIT_OBJECT_0 then
//WaitForSingleObject的作用是等待上hHndle进入发信号状态,对于互斥对象来说
//,当它不再被一个线程所拥有时,它就进入发信号状态。INFINITE表示一直等下去
//直到信号出现
begin

for i :=1 to MaxSize do
begin
Globalarray:=GetNextNumber;
// sleep(5);
end;
end;

ReleaseMutex(hMutex);//释放互斥对象,使之不再为线程所有
end;

procedure TForm1.ThreadDone(Sender: Tobject);
var
i,stop:integer;
begin
inc(doneflags);
stop:=strtoint(comboBox1.text);
ifdo
neflags=stop then
begin
listbox1.Items.Clear ;
for i := 1 to MaxSizedo
Listbox1.Items.Add(inttostr(GlobalArray));
CloseHandle(hMutex);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
hMutex:=CreateMutex(nil,false,nil);//创建互斥对象
do
neFlags:=0;
nextNumber:=0;
TFooThread.Create(False);
TFooThread.Create(False);
TFooThread.Create(False);
end;
 
多人接受答案了。
 
后退
顶部