COM,为什么我读不懂你的心

来源:互联网 发布:uu淘宝店叫什么 编辑:程序博客网 时间:2024/05/01 02:43
又遇到郁闷的事情:
有一个线程,入口大致如下:
th_main()
{
     while(conditon)
          svc();
}
struct ComPair
{
    ComPair(){ ::CoInitializeEx(0, COINIT_MULTITHREADED);}
    ~ComPair(){::CoUninitialize();}
};
svc()
{
ComPair com_pair_;
 
  ....这里,ADO数据库操作。
}
现象:
DEBug后,看到,ADO部分,创建第一个对象(Connnection)时,出现3个线程,::CoUninitialize()后,还剩一个。重复进入,再次多3个线程,退出,少两个。最要命的是,当线程多了以后(10几个左右,)线程增减开始无规律了。也可能下降的。
ADO肯定是有内存池的,据说也是有连接池的,但是不清楚。
据MSDN文档,这个问题似乎不是ADO的问题,而是COM的问题。COM大量使用消息循环、TLS,导致线程模型至关重要。我真是欲哭无泪啊!
本来,COM只是个二进制调用标准而已,为什么要搞得这么复杂?特别是进程内COM调用,本来是极其简单的道理,搞得象穿越地雷阵一样。
主线程用ADO到是从没什么问题,一旦要复杂一点,立刻问题多多。MS的API好像一贯如此啊。线程问题本来交给程序员做,是很简单的事情,非要自己处理,搞的接口一团糟,谁能从ADO文档中看出线程处理的问题来?这也太隐晦了吧!
再联想到COM指针不能直接跨线程传递的问题,也是一样的恶心:现象是导致内存泄漏!就算崩溃都比这让人舒心一点!
再次BS微软!