我写了个服务程序,当中有一个公共变量,要让客户端得到这个变量的值,每访问一下,这个变量加1.然后插入库。我开了7个这样的客户端不停访问这个服务。结果发现大多情况下一个数值总会被写入库两次(例如,有两个1357,两个1358,两个1359等,但也有少量数字只被写入了一次),我将此段代码括到了临界区里,代码如下:
  EnterCriticalSection(MyCs); //进入临界区
  try
    Result := te;
  finally
    te := te+1;
    LeaveCriticalSection(MyCs); //离开临界区
  end;
请问各位,这样对吗?是不是因为我的机子是双核的呀????

解决方案 »

  1.   

      EnterCriticalSection(MyCs); //进入临界区 
      try 
        te := te+1; 
        写库;
      finally 
        
        LeaveCriticalSection(MyCs); //离开临界区 
      end; 
      

  2.   

    EnterCriticalSection(MyCs); //进入临界区
      try
        inc(te);    
        Result := te;
      finally
        LeaveCriticalSection(MyCs); //离开临界区
      end; 
      

  3.   

    这样写也行,关键是要保证在使用前加锁,使用后解锁, LeaveCriticalSection(MyCs); //离开临界区 
    放在finally中是为了保证在语句块中这段代码一定会被执行