CoRegisterClassObject破坏线程安全
CoRegisterClassObject breaks thread safety
我正在测试一个将使用coregisterclassobject注册的自定义类工厂,我注意到它会导致线程问题。
我创建了一个test-com对象,并创建了它的一个实例,一切都按预期进行。它是一个进程内服务器,在注册表中,它的ThreadingModel是"Apartment"。如果我用apartment_thread调用CoInitializeEx,它会在同一个线程上创建对象,如果我用COINIT_MULTITHREADED调用它,它会按照应该的方式在单独的线程上创建它(因为它不能在多线程单元中创建)。
但是,如果我先创建一个自定义类工厂的实例,并将其注册到coregisterclassobject,那么该对象总是在同一个线程上创建的,即使线程模型与线程的单元不匹配。我认为使用coregisterclassobject不会改变线程在多线程单元中并且对象只能在单线程单元中的事实。
CoInitializeEx(NULL, COINIT_MULTITHREADED);
//CustomClassFactory *factory = new CustomClassFactory();
DWORD regNum = 0;
CLSID clsid = __uuidof(TestComObjLib::TestComObjCoClass);
//CoRegisterClassObject(clsid, factory, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®Num);
{
TestComObjLib::ITestComObjPtr ptr;
HRESULT hr = ptr.CreateInstance(clsid, NULL);
if(ptr){
auto str = ptr->HelloWorld();
cout << str << endl;
}
}
//CoRevokeClassObject(regNum);
CoUninitialize();
上面的操作按预期生成了新线程,但如果我取消注释注释行,COM不会创建任何新线程。我的班级工厂没有做任何奇怪的事情。它只加载dll directyl并调用DllGetClassObject来获取com定义的类工厂,并在其上调用createinstance。对HelloWorld的调用仍然有效,但我不确定为什么线程不是我所期望的。
当使用CoRegisterClassObject
显式注册类工厂时,将完全绕过注册表。即使注册表中根本没有提到对象,它仍然可以工作。
由于从未咨询过注册表,因此在那里指定的线程模型是不相关的。您的对象被认为居住在名为CoRegisterClassObject
的公寓中(或者准确地说,IClassFactory::CreateInstance
将从该公寓调用;类工厂可能会耍花招,让其对象在另一个公寓中实际创建,然后编组回调用者)。
- 从不同线程使用int64的不同字节安全吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- 线程调用的函数对对象删除是否安全?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具