在同一线程上CoInitializeEx(NULL,COINIT_MULTITHREADED)之后,CoInitialize(NULL)调用是否昂贵?

时间:2017-02-23 14:42:45

标签: c++ multithreading com

我的代码在一个线程上调用CoInitializeEx(NULL, COINIT_MULTITHREADED),然后在同一个线程上调用CoInitialize(NULL)

我知道CoInitialize(NULL)调用将失败RPC_E_CHANGED_MODE,但这不是我关注的问题。代码正确处理此错误如下: -

if (retValue == RPC_E_CHANGED_MODE) {
    thModel = kThModelMulti;  // thread was initialized with MTA model
}

请不要担心功能方面。 调用CoInitialize(NULL)是否存在任何性能问题 - 这会非常昂贵吗?如果是这样,我将更改代码以确定如果CoInitialize(NULL)已被调用,则甚至不会致电CoInitializeEx

1 个答案:

答案 0 :(得分:1)

调用CoInitialize(NULL)与调用CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)具有相同的效果。如果您在已调用CoInitialize(NULL)的线程上调用CoInitializeEx(NULL, COINIT_MULTITHREADED),则它将失败,错误代码为RPC_E_CHANGED_MODE。这在documentation

中特别提到
  

设置线程的并发模型后,无法更改。在先前初始化为多线程的公寓上调用 CoInitialize 将失败并返回RPC_E_CHANGED_MODE。

性能影响无关紧要。这是一个功能性问题,也就是bug。