请问一个多线程问题:
我在三个线程里都同时用到了 同一个全局变量,是不是一定要加上 synchronize 呀???
可是加上后,程序每隔20秒左右会停住(感觉运行不过来一样),五六秒之后就又正常了,这样一直运行着;
如果不用synchronize 的话运行时正常,可是线程会在运行几十次之后就停止啦。
 
我在线程里加了sleep(15000);对那个全局变量,有读和写的操作。 

解决方案 »

  1.   

    另外请问一下:synchronize 与临界区和互斥 之间的关系是什么?
      

  2.   

    synchronize,是指同步,就没个线程用读取和写都是同一个,
    你代码有问题,帖出来看看
      

  3.   

    可以单独定义一个累来读写临界值(参考TThreadList类)在类中:
    1、定义:
      FLock: TRTLCriticalSection;2、初始化:
      InitializeCriticalSection(FLock);
      FList := TStringlist.Create;
    3、使用互斥临界
      EnterCriticalSection(FLock);
      FList.Add(p);
      LeaveCriticalSection(FLock);4、删除临界
      DeleteCriticalSection(FLock);
      

  4.   

    { TThreadList class }  TThreadList = class
      private
        FList: TList;
        FLock: TRTLCriticalSection;
        FDuplicates: TDuplicates;
      public
        constructor Create;
        destructor Destroy; override;
        procedure Add(Item: Pointer);
        procedure Clear;
        function  LockList: TList;
        procedure Remove(Item: Pointer);
        procedure UnlockList;
        property Duplicates: TDuplicates read FDuplicates write FDuplicates;
      end;
    { TThreadList }constructor TThreadList.Create;
    begin
      inherited Create;
      InitializeCriticalSection(FLock);
      FList := TList.Create;
      FDuplicates := dupIgnore;
    end;destructor TThreadList.Destroy;
    begin
      LockList;    // Make sure nobody else is inside the list.
      try
        FList.Free;
        inherited Destroy;
      finally
        UnlockList;
        DeleteCriticalSection(FLock);
      end;
    end;procedure TThreadList.Add(Item: Pointer);
    begin
      LockList;
      try
        if (Duplicates = dupAccept) or
           (FList.IndexOf(Item) = -1) then
          FList.Add(Item)
        else if Duplicates = dupError then
          FList.Error(@SDuplicateItem, Integer(Item));
      finally
        UnlockList;
      end;
    end;procedure TThreadList.Clear;
    begin
      LockList;
      try
        FList.Clear;
      finally
        UnlockList;
      end;
    end;function  TThreadList.LockList: TList;
    begin
      EnterCriticalSection(FLock);
      Result := FList;
    end;procedure TThreadList.Remove(Item: Pointer);
    begin
      LockList;
      try
        FList.Remove(Item);
      finally
        UnlockList;
      end;
    end;procedure TThreadList.UnlockList;
    begin
      LeaveCriticalSection(FLock);
    end;
      

  5.   

    关于全局变量,在同一进程内用临界区比较好,上面已经给了代码,这里就不多说了,
    关于synchronize ,更多的是用在和VCL界面的同步,他通过消息的形式,使得方法在主线程内执行
      

  6.   

    同进程用临界区。如果要全局变量是一个数字则可以用原子操作的方式。《WINDOWS核心编程》搞一本看看就全明白了。
      

  7.   

    借楼主宝地用一下,
    临界区和青互斥体Mutex有什么不同么?