书中的一段话:在Free Threading之中,每一个应用程序服务器之中的COM对象的方法可能被数个线程执行,所以你的程序代码也必须保护方法之中使用的区域变量。
问:这里的方法之中的区域变量指什么?
如果就是指方法里的局域变量a,例如
procedure T1.MM(i: integer);
var
  a:integer;
begin
end;
那为什么这个局部变量a也需要保护,正常多线程访问一个方法只是对全局变量要保护,方法里的局域变量是不需要保护的,看了李的书后以后对这个地方有点费解。
请大家指点一下,谢谢!

解决方案 »

  1.   

    delphi 应该不支持完全的free吧procedure   T1.MM(i:   integer);
    var
        a:integer;
    begin
    end;这里的 a 不要保护  T1 = class(xxx)
      private
        a: Integer; // 这个在 free 下要保护,做一个临界就可以了
      ..
      

  2.   

    local variable is allocated on the stack. Each thread has its own stack, I don't think local variable  is in danger.
      

  3.   

    按照1楼所说的,李的书里所描述的方法的区域变量就不是指在方法里声明的局部变量,方法里的局部变量每次调用的时候的地址是不同的,因为每次都有自己的堆栈,所以不用保护,而类变量的如果是同一个对象的话需要保护(我也这样认为,因为是同一个内存空间),如果是不同对象的话涉及到类的变量就需要保护吗?我认为也不用保护,因为是不同的内存空间.总结,李的书里描述的区域变量应该指类变量,在Free模式里,由于 针对某个COM对象,所以只有一个类变量,所以需要保护.不知道是否正确.谢谢大家参与,都有分. 
      

  4.   

    说得可能不对,请大家指教~没看过李维的那本书,不过我想保护指的是对COM+中的全局对象中私有成员的保护~
    用多实例的COM+时,每个实例都会共享COM+中全局对象的私有成员,这时一般是用ThreadGate的方式来保护私有数据或队列,可用1楼大哥说的TCriticalSection来保护~