(能力不足,看的时候多,第一次提问,错误之处望指点)
(原发在分布式开发栏,不知如何给分,再次发贴) 从两层数据开发学习转向分布式开发,被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应对全局或局部变量进行保护不知是不是这个意思(但参考书对如何保护却只言未提),如何正确保护及协调从而保证各客户端传入及返回值正确? 先谢过了!
(原发在分布式开发栏,不知如何给分,再次发贴) 从两层数据开发学习转向分布式开发,被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应对全局或局部变量进行保护不知是不是这个意思(但参考书对如何保护却只言未提),如何正确保护及协调从而保证各客户端传入及返回值正确? 先谢过了!
Free,Both这两种没有研究过.
关注
2、如果你要写Free或者Both的RDM,你对RDM中的所有全局变量、成员变量都得进行同步处理,你接口中的每一个方法都有可能重入,也有可能多个成员方法同时执行,你得保证它们不会出现错误。至于局部变量,因为是在栈上的,而每个线程都有自己的栈,所以是没必要保护的。
系统会为每个线程分配栈空间,线程切换的时候系统会自动切换该线程的栈顶指针到ESP寄存器,因此就算是一个方法中的语句被两个线程交替执行,局部变量也会有不同的两份。