回 帖 发 新 帖 刷新版面

主题:多线程问题

我有个List,里面很多不同的项。每个线程执行完操作后,就会从List中取出最后一项继续操作,并将最后项删除。正常情况下每个线程取到的项都不同。
但当多个线程恰好同步时,比如说两个线程恰好同时执行完操作,同时从List取出
最后一项,那这两个线程取出的内容就一模一样了。
这个问题如何避免啊?

回复列表 (共1个回复)

沙发

多个线程互斥使用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;

我来回复

您尚未登录,请登录后再回复。点此登录或注册