你注意到COM编程中“STA 单线程套间”的重入问题了吗?

在COM编程中,COM线程模型的选择是避免不了的。网上已有大量介绍“COM线程模型”的文章,在这里我只想说“STA 单线程套间”并不像想象中的那么简单,在实际的开发中会出现“重入问题”。

“STA 单线程套间”,指的是一个线程只能建立一个套间,在线程中创建的COM对象只属于这个套间,其他线程对此线程中COM对象的调用都必须通过代理对象串行调用。这样,“STA 单线程套间”轻松解决了多线程之间的“同步问题”。

于是,我们将COM对象都采用“STA 单线程套间”,是不是就万事大吉了呢?当然不是。为了避免死锁,所有的COM套间类型都支持重入,当然“STA 单线程套间”也不例外。当套间中的线程通过代理调用到其他套间中的对象的时候,调用者线程在等待此调用完成的过程中,它可以继续处理其他的入方法请求。

 

例如,线程1中的对象a访问线程3中的对象c,对象c又访问线程4中的对象d。此时,线程4在处理传入的调用,线程3在等待线程4返回,线程1在等待线程3返回。由于“STA 单线程套间”支持重入,所以,此时当线程2中的对象b发起对线程3中对象c的访问时,就会立即执行。于是,线程3中的对象c就面临着“重入问题”的考验。

在一个多线程的程序中,这种“重入问题”的发生可能无处不在。如果我们忽视了这个问题的存在,那么在后续的开发中就会遇到许多莫名其妙的问题,而且极难纠错。因为,我们的逻辑是对的,只是“重入问题”的发生,会将代码的执行环境(变量或循环结构等)改变或破坏,使得程序无法再进行下去,或产生错误的结果。

想象一下,我们在每实现一个COM对象的方法时,都要评估这个方法会不会产生“重入问题”,如果发生“重入问题”,这个方法内的执行环境(变量或循环结构等)是否会被改变或破坏,是否需要对其他地方的代码进行调整。如果是这样的话,“重入问题”比“同步问题”轻松不了多少。

 

总之,请记住这样一个原则:“MTA 多线程套间”考虑“同步”,“STA 单线程套间”考虑“重入”。

 

更多深入的探讨请参考

COM本质论(简体)第五章套间 5.3跨套间访问 P193

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值