ISimpleCOMObject2Ptr spISimpleCOMObject2A;
ISimpleCOMObject2Ptr spISimpleCOMObject2B;
spISimpleCOMObject2A.CreateInstance(__uuidof(SimpleCOMObject2));
spISimpleCOMObject2B.CreateInstance(__uuidof(SimpleCOMObject2));
spISimpleCOMObject2A -> TestMethod1(); // ID of Thread = 0x1CC
spISimpleCOMObject2B -> TestMethod1(); // ID of Thread = 0x1CC
当在MTA内创建时,他们可能是在两个不同线程空间里激活的,当然,线程ID就不同了。
但如果是在一个STA内激活,因为STA仅有一个线程,这两个对象所运行的线程肯定就是这一个线程了,它们肯定会打印相同的 ID值,只是这个时候两个对象方法执行缺少了并发性了,一次只能执行一个对象的方法,这也是为了线程安全做出的牺牲。
如果两个对象实例是在两个STA里创建的,这样他们分别被这两个STA内的线程所执行,如果打印ID ,肯定也不同,这个时候,两个对象自身的实例数据并发访问是安全的,但客户得为这两个对象实例可能访问的全局变量和静态变量加以保护。