如果我调用一个在一个线程上返回BSTR的COM方法,那么从另一个线程调用该BSTR上的SysFreeString()安全吗?一旦COM调用完成,我将不再在第一个线程上使用BSTR,因此不应该出现任何并发问题。但是,考虑到COM与线程的关系,我不确定SysFreeString()是否依赖于在同一个线程上分配的BSTR。
样本代码:
BSTR value = nullptr;
HRESULT hr = pComObject->DoSomething(&value);
if(FAILED(hr))
{
return hr;
}
std::thread t([value] {
// do something with value
SysFreeString(value);
});
t.detach();发布于 2015-07-10 13:35:13
MSDN并没有明确指出这一点,但是仍然有关于Sys*String函数通过CoGetMalloc和朋友使用IMalloc的OS实现的引用。
自动化可以缓存分配给BSTR的空间。这将加速SysAllocString/SysFreeString序列。但是,这也可能导致IMallocSpy将泄漏分配给错误的内存用户,因为它不知道自动化所做的缓存。
COM实现线程安全吗?
通常,您不应该实现IMalloc,而应该使用COM实现,这在管理任务内存时是线程安全的。通过调用IMalloc函数,可以获得指向COM任务分配程序对象的CoGetMalloc的指针。
总之,从另一个线程释放字符串是可以的。
https://stackoverflow.com/questions/31341262
复制相似问题