现在做多线程需要这样,比如有100个线程,每个执行完计数器就加1但是就像操作系统中的信号量一样,对这个计数器同时只能有一个线程在使用如果计数器被占着了,其他的 线程就要等待现在我已经会这样,就是比如有5个线程,用WaitForMultipleObjects可以5个全部结束时执行某个操作
但是如何能每个一执行完就加1,且要独占~~~
谁能给个解决方案或例子!!!!谢谢了!!!!!!!!!!!

解决方案 »

  1.   

    WaitForMultipleObjects的时候,不需要Wait for all,而有任意一个返回,就执行操作。这个无所谓独占,因为这个操作只在一个线程,即执行WaitFor的线程当中操作。
      

  2.   


    .......interface
    uses SyncObjs,......;type
      {安全计数器}
      TSecurityCounter=class
      private
        //计数器
        FCounter: LongWord;
        //计数器锁
        FLock: TCriticalSection;
      public
        //创建
        constructor Create;
        //注销
        destructor Destroy; override;
        //计数器加一
        procedure ScInc;
        //计数器值
        property CounterValue:LongWord read FCounter;
      end;
    .............implementationconstructor TSecurityCounter.Create;
    begin
      FLock:=TCriticalSection.Create;
      FCounter:=0;
    end;
    destructor TSecurityCounter.Destroy;
    begin
      FLock.Free;
    end;
    procedure TSecurityCounter.ScInc;
    begin
      FLock.Enter;
      Inc(FCounter);
      FLock.Leave;
    end;
      

  3.   

    不需要Wait   for   all这个具体如何实现我原来的等待线程里的
    Execute里的语句是  WaitForMultipleObjects(Count, @ThreadHandle, True, INFINITE);如何改
      

  4.   

    to 1楼,(先撇开楼主的问题不谈,)简单的计数器,在这里最好的办法不是使用临界区,而是采用原子操作InterlockedIncrement/InterlockedDecrementvar
      dwWaitRet:DWORD;
      iCount:Integer;..
      iCount := Count
      while true do
        begin
          dwWaitRet := WaitForMultipleObject(Count(*64 is maximum*),@ThreadHadles,False,INFINITE);
          if dwWaitRet = $0FFFFFFFF then
            begin
              //Error:Is Failed
              Exit;
            end;
          if dwWaitRet = WAIT_TIMEOUT then
            begin
              //Error:Time Out
              Continue;
            end;
          if (dwWaitRet>=WAIT_OBJECT_0) and (dwWaitRet <WAIT_ABANDONED_0) then
            begin
              Inc(CompletedCount);
              Dec(iCount);
              if iCount = 0 then
                break;
              continue;
            end;
      
      end;
      

  5.   

    直接用原子操作就可以了,所有线程不用等待InterlockedExchangeAdd(变量,1) 给指定变量加1 
      

  6.   

    uses
    SyncObjsCS: TCriticalSection;cs.enter;
    ...
    需锁定的原子操作
    ...
    cs.leave;
      

  7.   

    创建 二级 线程,由二级线程在创建100个三级线程,有二级线程负责等待。不会有问题的。
    可参考刘艺 <面向对象编程思想>