System单元的TInterfacedObject对象,其中_Addref和_Release实现使用了InterlockedIncrement和InterlockedDecrement函数,这两个函数按照MSDN的说法这些函数不能用在多CPU系统和非X86系统上面。英文原文如下:
The variable pointed to by the lpAddend parameter must be aligned on a 32-bit boundary; otherwise, this function will fail on multiprocessor x86 systems and any non-x86 systems. 我不清楚,在多CPU系统中使用这些函数会带来什么后果,以及Delphi的程序员真的犯下了这些低级错误?欢迎大家讨论。

解决方案 »

  1.   

    不会吧,ATL也是用的这两个函数啊。
      

  2.   

    多CPU系统下使用, 因为会涉及到处理器调用问题, 因为程序运行的CPU是不固定的, 这可能会导致时序上的问题.   但这只是可能而已. 不知道你的CSDN是什么时候的版本.
      

  3.   

    我的MSDN版本是最新的,VS.net附带的。我感觉我好像看出了问题,好像我对英文的理解不对。正确的译文,是不是这样?变量指针必须指向32位边界,否则在多X86 CPU系统和非X86 CPU系统中将发生错误。
      

  4.   

    function InterlockedIncrement(var Addend: Integer): Integer; stdcall;
      external kernel name 'InterlockedIncrement';function InterlockedDecrement(var Addend: Integer): Integer; stdcall;
      external kernel name 'InterlockedDecrement';这个是System单元里面定义的原型,但这两个封装仅仅对Linux系统有效,对于Windows系统,实际上在TInterfacedObject里面调用的是Kernal动态库里面的同名函数....至于楼主说的为什么不适用于非X86系统和多CPU系统,我想应该是这两个函数本身就是线程安全的,就是在当前线程进行引用计数的增减时进行了线程保护,防止了多线程同时操作引起的冲突,所以对于多CPU系统,肯定使用这些函数起不到线程安全的作用。另外对于非X86的系统,我想应该是和CPU结构有关系,静待高论!
      

  5.   

    >所以对于多CPU系统,肯定使用这些函数起不到线程安全的作用。fs这句仔细说说?
      

  6.   

    我的考虑是对于线程安全肯定是借助于CPU的某个寄存器来存放标志位来保护一个被线程访问的COM对象,如果是多CPU,肯定做不到这点了....
      

  7.   

    ...哦,多CPU的系统要复杂许多,也许需要另外的编码吧