主题:多线程问题
ak47smd
[专家分:0] 发布于 2007-07-18 11:36:00
我有个List,里面很多不同的项。每个线程执行完操作后,就会从List中取出最后一项继续操作,并将最后项删除。正常情况下每个线程取到的项都不同。
但当多个线程恰好同步时,比如说两个线程恰好同时执行完操作,同时从List取出
最后一项,那这两个线程取出的内容就一模一样了。
这个问题如何避免啊?
回复列表 (共1个回复)
沙发
zhangjinxin_2001 [专家分:0] 发布于 2007-07-19 10:04:00
多个线程互斥使用List这个临界资源试试
我这里有一个互斥类的单元文件:
unit SyncObjsEx;
interface
uses Windows,Messages,SysUtils,Classes,SyncObjs;
type
THandleObjectEx=class(ThandleObject)//THandle 为互斥类的父类
protected
FHandle:THandle;
FLastError:Integer;
public
destructor Destroy;override;
Procedure Release;override;
function WaitFor(Timeout:DWORD):TwaitResult;
property HLastError:Integer read FLastError;
Property Handle:THandle read FHandle;
end;
TMutex=class(THandleObjectEx)
public
constructor Create(MutexAttributes:PSecurityAttributes;InitialOwner:Boolean;const Name:string);
procedure Release;override;
end;
implementation
{THandleObjectEx}
destructor THandleObjectEx.Destroy;
begin
windows.CloseHandle(FHandle);
inherited Destroy;
end;
procedure THandleObjectEx.Release;
begin
end;
function THandleObjectEx.WaitFor(Timeout:DWORD):TWaitResult;
begin
case WaitForSingleObject(Handle,Timeout) of
WAIT_ABANDONED:Result:=wrAbandoned;
WAIT_OBJECT_0:Result:= wrSignaled;
WAIT_TIMEOUT:Result:=wrTimeout;
WAIT_FAILED:
begin
Result:=wrError;
FLastError:=GetLastError;
end;
else
Result:=wrError;
end;
end;
{TMutex互斥类实现}
constructor TMutex.Create(MutexAttributes:PSecurityAttributes;InitialOwner:Boolean;const Name:string);
begin
FHandle:=CreateMutex(MutexAttributes,InitialOwner,PChar(Name));
end;
procedure TMutex.Release();
begin
Windows.ReleaseMutex(FHandle);
end;
end.
把它加到你的工程里面去.
下面是用法:
m_oMutex:=Tmutex.Create(nil,false,'');//初始化互斥变量
//初始化完成后就可以如下使用了,多个线程用这一个信号量就行了。
if wrSignaled=m_oMutex.WaitFor(1000) then
begin
try
{访问临界资源代码放这里}
finally
m_oMutex.Release;
end;
end;
我来回复