只能被一个线程访问的对象不需要同步 例如 Windows的窗口过程 但是对于全部变量的访问,仍需要同步保护 有可能被多个线程访问的对象需要有同 步机制 Event、 Semaphore、 CriticalSection、 Mutex 这样的代码被称为 thread-safe
同步 • 只能被一个线程访问的对象不需要同步 – 例如Windows的窗口过程 – 但是对于全部变量的访问,仍需要同步保护 • 有可能被多个线程访问的对象需要有同 步机制 – Event、Semaphore、CriticalSection、Mutex – 这样的代码被称为thread-safe
Apartment(套间) 是一个逻辑概念,也有实体对应 是COM对象的执行环境 分为三种套间 STA MTA COM+引入 TNA(thread-neutral apartment)*
Apartment(套间) • 是一个逻辑概念,也有实体对应 • 是COM对象的执行环境 • 分为三种套间 – STA – MTA – COM+引入TNA(thread-neutral apartment) *
STA套间 每个STA套间包含一个线程 STA套间和线程有一一对应关系 当线程被创建后,用COM库初始化就建立起 个STA套间 CoInitialize NULL) Ex* ColnitializeEX(NULL, COINIT APARTMENTTHREADED) 在线程结束之前,调用 CoUninitialize结束套间 套间线程包含消息循环 COM在套间线程中创建了一个隐藏的窗口 用途:同步、分发消息
STA套间 • 每个STA套间包含一个线程 – STA套间和线程有一一对应关系 • 当线程被创建后,用COM库初始化就建立起 一个STA套间 – CoInitialize(NULL); – 或者CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); • 在线程结束之前,调用CoUninitialize结束套间 • 套间线程包含消息循环 • COM在套间线程中创建了一个隐藏的窗口 – 用途:同步、分发消息
STA套间(续) 在STA中创建的COM对象都属于这个STA STA对象不必处理同步,因为对象的方法代 码只能被这个STA套间的线程调用 但DL程序的引出函数如D) I GetClassobject 和 DIlCanunloadnow等仍需同步处理。 类厂是否需要线程安全,取决于类厂的策略 如何把接口指针交给调用者 日动 marshaling 手工 marshaling
STA套间(续) • 在STA中创建的COM对象都属于这个STA • STA对象不必处理同步,因为对象的方法代 码只能被这个STA套间的线程调用 • 但DLL程序的引出函数如DllGetClassObject 和DllCanUnloadNow等仍需同步处理。 • 类厂是否需要线程安全,取决于类厂的策略 • 如何把接口指针交给调用者 – 自动marshaling – 手工marshaling
STA接收调用示意图 消息 STA stub 隐藏窗口份发消息 stub
STA接收调用示意图 消息 STA 隐藏窗口 分发消息 stub stub