COM组件的多线程测试-Apartment模型
版本信息:
版本
作者
修正/记录
Ver 1.0
Zzyx
2003-5-16。创建
关键字:
COM 多线程 线程模型 single Apartment CoInitialize CoInitializeEx
COINIT_APARTMENTTHREADED COINIT_APARTMENTTHREADED
测试对象
组件对象线程模型为Apartment。
组件代码:
STDMETHODIMP CTest2::Test(long nCnt)
{
printf("\n对象Test2。所在线程ID:%d",GetCurrentThreadId());
_tzset();
char tmpbuf[128];
_strtime( tmpbuf );
printf( "\n\t线程ID:%d,begin time:\t%s\n", GetCurrentThreadId(),tmpbuf );
Sleep(1000*nCnt);
_strtime( tmpbuf );
printf( "\n\t线程ID:%d,end time:\t%s\n", GetCurrentThreadId(),tmpbuf );
return S_OK;
}
对象跨线程调用
测试方法:
客户端创建一个对象实例,把该对象的指针传递给多个线程
每个线程中调用该实例的方法
观察输出结果
编号
客户端COM环境
结果
心得
S1
NO
无法创建对象
S2
CoInitialize
同步执行
且对象的方法被创建的多个线程同步调用
从组件的角度看,需要管理线程同步
S3
CoInitializeEx
COINIT_APARTMENTTHREADED
同上
同上
S4
CoInitializeEx
COINIT_MULTITHREADED
顺序执行
对象的方法被同一个线程顺序调用
该线程为系统创建的
COM完成了线程同步的工作。
但如果是不同的方法呢?逻辑上应该也是同步的,未测试
多线程中对象实例调用
测试方法:
客户端启动多个线程
每个线程创建一个对象实例,调用该对象的方法。
观察输出结果。
测试结果如下:
主线程
COM环境
编号
线程COM
环境
运行结果
NO
T1
NO
无法创建对象
T2
CoInitialize
同时调用
每个线程都启动
每个COM对象运行在各自的调用线程中
T3
CoIntializeEx
COINIT_APARTMENTTHREADED
同时调用
每个线程都启动
每个COM对象运行在各自的调用线程中
T4
CoIntializeEx
COINIT_MULTITHREADED
注意:顺序调用
每个线程都启动
但对象都运行在另外的一个线程中,似乎是系统创建的
Yes
CoInitialize
T5
NO
无法创建对象
T6
CoInitialize
同T2
T7
CoIntializeEx
COINIT_APARTMENTTHREADED
同T2
T8
CoIntializeEx
COINIT_MULTITHREADED
!!!注意!!!
顺序调用
每个线程都启动
每个对象运行在相同的一个线程中,似乎是系统创建的
CoInitializeEx
COINIT_APARTMENTTHREADED
T9
NO
T10
CoInitialize
同T2
T11
CoIntializeEx
COINIT_APARTMENTTHREADED
同T2
T12
CoIntializeEx
COINIT_MULTITHREADED
同T8
CoInitializeEx
COINIT_MULTITHREADED
T13
NO
无法
T14
CoInitialize
同T2
T15
CoIntializeEx
COINIT_APARTMENTTHREADED
同T2
T16
CoIntializeEx
COINIT_MULTITHREADED
同T8
输出结果见附录