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

本文探讨了一个关于ADO和COM在线程环境下引发的线程数量异常增加及减少无规律的现象。作者通过具体代码示例说明了问题发生的背景,并表达了对于微软API设计中线程管理和COM接口实现方式的不满。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

又遇到郁闷的事情:
有一个线程,入口大致如下:
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微软!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值