谢绝回复!

解决方案 »

  1.   

    多线程调用DLL时,用不用使用线程同步?
      

  2.   

    DLL内有创建对象的过程!
    当线程A调用DLL的创建对象函数时,对象被创建在线程A的堆栈中?还是进程的全局变量区?
      

  3.   

    刚才做了一下测试。(用C++代码做的测试)
    结论如下:
    1.在线程函数 内定义的变量 被分配在 本(自己)线程堆栈空间内,所以不用进行 线程同步处理
    2.在线程函数 内使用全局变量 需要进行线程同步处理
    3.在线程函数 内使用的全局变量,是线程变量,也可以不用进行线程同步处理
    譬如:delphi可以用Threadvar 关键字定义 
          vc中可以使用__declspec(thread)根据以上测试结果,LZ的问题:
    当线程A调用DLL的创建对象函数时,对象被创建在线程A的堆栈中?还是进程的全局变量区? 
    》》应该创建在 线程A的堆栈中 (创建的对象中必须没有对全局变量的引用)
      

  4.   

    动态创建的应该是在堆内存,而不是栈内存。如果DLL提供的接口返回了实例的指针,那么基本上可以认为是相互独立的,但是如果是没有通过接口及时返回相应的指针,在需要的时候还要去取,就很难界定是否线程安全。
      

  5.   

    各位老大们,可能我说得不清楚!
    完整代码不方便贴,比较多!
    //类文件我先创建了一个单元,这个单元内包含一个类声明.单元名为proxyCust.pas
    TproxyCust=class
      private
      public
      
    end;
    //DLL业务逻辑
    uses
      proxyCust;
    TCust=class
      private 
         FCust:TProxyCust;
         procedure CreateProxyObject;
    end;procedure TCust.CreateProxyObject
    begin
      FCust:=TproxyCust.Create;//如果我用多线程调用时,用不用同步
    end;//线程调用DLL  thread1.RequestDLL()
      thread2.RequestDLL()
      

  6.   

    我在用线程调用 DLL时,不需要返回实例指针!直接让其在DLL内计算!
      

  7.   

    那就只需要保证每个RequestDLL都创建一个新的接口实例(或者池化的话是使用一个空闲的实例),实例与实例之间即使有共享访问也能够保证线程安全即可。
      

  8.   

     
    ok,那我总结一下!
    //我用COM+
    在客户端有N次Request后,COM+会自动对request进行维护(可能生成队列,不过我还是有点困惑,COM+真能把所有向COM+服务器的请求全部记录在它的申请队队列中?),开发人员仅需要考虑如何将业务DLL进行安全装载,这也就是一种异步处理!
      

  9.   

    COM+不会自动维护队列,但是会维护一个对象池,通过设置COM+对象的一个延迟生存时间,可以更大程度上重用原有的实例。
      

  10.   

    由于单一进程某些资源的有限性,当并发请求较多的时候,会创建多个DLLHOST进程来提供服务,正因为如此,如果再在这个基础上实现一个进程内的池化管理,更好的利用这一特性,那么性能就会有不少的提升。比如,通常的DCOM,都是当最后一个用户退出之后就会终止进程,如果这时新的服务请求到来,那么又需要一个新的进程来服务,每一个新的进程启动都需要消耗大量的时间和资源,而良好的延尽设置则可以在一定程序上避免不必要的由于重复进程启动关闭所带来的开销。