(能力不足,看的时候多,第一次提问,错误之处望指点)
(原发在分布式开发栏,不知如何给分,再次发贴) 从两层数据开发学习转向分布式开发,被RDM中的套间问题弄糊涂了(书也查阅了不少,越看越糊涂),以个人理解举一例: 建立一RDM(定为myserver),加入一函数myfun 
type 
  Tmyserver = class(TRemoteDataModule, Imyserver) 
  private 
    { Private declarations } 
  protected 
    class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override; 
    function myfun(var vin: OleVariant): OleVariant; safecall; 
  public 
    { Public declarations } 
  end; implementation 



function Tmyserver.myfun(var vin: OleVariant): OleVariant; 
begin 
  Result:=vin+1; 
end; 问题: 
  1,若是创建RDM时Threading model为Apartment,个人理解,N个客户端调用myfun时是依次产生N个独立线程,依次独立执行,即第一个客户端传入2返回3,第二个客户端传入99返回100,第N个客户端传入24返回25,在编程时不需考虑同步及协调问题,第一个客户端传入的2不会影响到第二个客户端,即第二个客户端中的99不会被2和24(第N个客户端的传入数据)影响。不知理解的对不对? 
  2,若是创建RDM时Threading model为Free或Both时,个人理解,N个客户端调用myfun时是同时产生N个独立线程,同步执行,因Free或Both是同步执行,若不进行协调及调度,第一个客户端传入的数据2会影响到第二个客户端,即第二个客户端可能得到的传入数据是2,同理,返回值也因未进行协调及调度可能第一个客户端返回是100,第二个客户端返回的是25,第三个客户端返回的是3。疑问:若确实如此,应如何进行同步协调?很多参考书说的用Free或Both应对全局或局部变量进行保护不知是不是这个意思(但参考书对如何保护却只言未提),如何正确保护及协调从而保证各客户端传入及返回值正确? 先谢过了! 

解决方案 »

  1.   

    我想你第一种理解是对的,我也是这样用的.
    Free,Both这两种没有研究过.
    关注
      

  2.   

    谢6楼的回答,分就暂时不给了,等结贴时一并给吧!学习用书是李维老师的《分布式多层应用系统》,书中也提到了应该用Threading model的Apartment模式,但李维老师却在书中提到用ADO时最好用FREE模式,却没了下文(也没有提到保护及协调),我学习两层时是以ADO为主的,所以才钻入了牛角尖!趁着贴子有点人气,再提个疑问:RDM使用BDE时加入SESSION用来进行多任务协调的,那如果用ADO,是否还需加入SESSION,若不需要,ADO执行时,是不是同时分别建立与SQL的连接任务?新人学习,问题有点多,期望高人们给予指点,小弟先谢过了!
      

  3.   

    要理解套件的概念,建议从COM/COM+的原理书看起.从COM的产生一直发展到COM+这样的一整个过程说得比较详细.
      

  4.   

    感谢僵哥的指点,这几天正转到COM及COM+的学习,原以为学数据库编程是可以断章进行的,想得简单了点!惭愧!不知僵哥能否点化下小弟在贴子中的疑问,先谢过了!
      

  5.   

    1、我想这个问题是因为你的RDM是多个实例的原因,每有一个客户端进行连接会调用一个CreateInstance来创建一个RDM的实例,所以每个客户端的调用看起来是各不相关的。线程套间的概念是,该实例是否能够不经过同步就直接使用在多个线程之中(线程安全的实例),因此你要比较Apartment和Free的区别时,应该看同一个实例(接口),能否不经过列集、散集就直接在另外的线程中使用。
    2、如果你要写Free或者Both的RDM,你对RDM中的所有全局变量、成员变量都得进行同步处理,你接口中的每一个方法都有可能重入,也有可能多个成员方法同时执行,你得保证它们不会出现错误。至于局部变量,因为是在栈上的,而每个线程都有自己的栈,所以是没必要保护的。
      

  6.   

    感谢lake_cx,(看了你的回贴,有点高深,自卑中,不知何时才能到达你的水平)对2的回答是不是可以这样理解,以我所举的例子中,用FREE模式,vin和result是属于局部变量,是不会相互影响的,是这样吗?
      

  7.   

    不会有影响,即使是Free模式。
    系统会为每个线程分配栈空间,线程切换的时候系统会自动切换该线程的栈顶指针到ESP寄存器,因此就算是一个方法中的语句被两个线程交替执行,局部变量也会有不同的两份。
      

  8.   

    感谢回贴的各位朋友,通过对COM及COM+的学习,基本上弄懂了COM对象、接口、进程、套间、实例、线程、池、列集、散集的概念(以上的概念对任何一个初学者来说确实有点生涩难懂)感谢willflyz的回复及鼓励,FREE及NEUTRAL的线程模式虽说DELPHI提供了这两种线程模式,但现有的学习书籍中(包括DELPHI的官方说明)都未对这两种线程模式进行详细说明(虽然都提到这两种线程更高效,但未提及如何安全使用),所以个人感觉还是用STA线程安全妥当。感谢僵哥的回复,尤其是你的“数据连接池”示例让我加深了对“池”的理解。感谢lake_cx的两次回复,佩服你的汇编能力,第二次回复解答了FREE线程的局部变量问题。最后还是想提一句,三层开发架构及思路、并发效率及并发安全保护这方面的贴子确实很少,看来是属于高人们秘不外宣的技巧,期待有高人无私奉献下这方面的经验。