Q: 为什么如果我们把这两个组件安装在同一个COM+组件包中问题就不会出现(zz)...
假设obj1 和obj2 共享 一个STA worker thread. 如果obj1正在呼出自己的aparment (比如调用另外一个进程里的objects等等), 恰好这时clients请求obj2的方法调用,根据STA apartment的可重入性(reentrancy), obj2会允许获得在该STA worker thread 上执行的权利。而obj1在完成自己的呼出后必须重新要求获得对该STA worker thread的控制权。一种极端的情况时,如果obj2执行的操作很长时间不返回,那么obj1必须等待。
回到原来的例子中,假设obj1和obj2都属于component A, 然后b属于component B,obj1创建了b. 当A 和B都在同一Server package中时候,obj1和b 属于同一apartment (进一步属于同一com+ context), 这样在obj1 呼叫b的时候,并没有呼出apartment, 所以调用都是同步的 (换句话说,此时即使有clients调用obj2的请求也必须等待obj1完成后方可)。与之相对比的是如果AB配在不同的server package中,那么obj1呼叫b时候则允许obj2也允许在该STA worker thread 上同时执行 (在本例子中调用后台的SQL2K)。换句话讲DCOM 在处理STA呼出时候是区分该呼出是在同一还是非同一apartment中的。obj1在完成呼叫b后需要重新获得对其STA worker thread 的控制权才能要求DTC提交transaction。这样的话obj1要等待obj2完成对数据库的调用(obj2通常是在update/insert tables), 而obj2要等待obj1提交transaction从而释放占有的locks。 Deadlock!!
从上面的分析我们可以看到,最有效的方法是不使用STA thread pool而使用MTA thread pool (就是把component封装到MTA 中)。 MTA thread 的好处是objects跟thread 没有绑定关系,obj1执行完后不比等待重新进入创建他的thread;另外MTA worker thread的大小没有上限。
作为一个workaround,我们可以要求STA worker thread开始时候每个object都获得一个单独的worker thread, 从而最大限度减少因为两个objects共享worker thread引起的deadlock, 这就是Q303071里面所讲的。
转载于:https://www.cnblogs.com/Snowwolf/archive/2004/05/21/10609.html
Q: 为什么如果我们把这两个组件安装在同一个COM+组件包中问题就不会出现(zz)...相关推荐
- Linux上两种软件安装方式
Day 8 安装包获取 安装包获取: 1.本地获取 2.网络获取 第一种安装方式 rpm 安装工具 (包名,软件名) .rpm 格式的安装包 eg:-r--r--r--r. 1996 root roo ...
- centos下两种方法安装git
centos 5 64位下两种方法安装git 这里来给大家介绍下编译安装和yum安装git. 系统:centos 5.5 64位 需要的软件包:git-latest.tar.gz epel-r ...
- R语言使用zoo包中的rollapply函数计算两个时间序列数据列之间的滚动相关性(Rolling correlations)、例如,计算两种商品销售额之间的3个月的滚动相关性
R语言时间序列数据滚动相关性分析(Rolling correlations).R语言使用zoo包中的rollapply函数计算两个时间序列数据列之间的滚动相关性(Rolling correlation ...
- ebc是什么意思_UEFI+GPT和Legacy+MBR两种模式安装的系统有什么区别
UEFI+GPT和Legacy+MBR两种模式安装的系统有什么区别?很多电脑小白都搞不懂UEFI.GPT.BIOS.MBR到底是什么意思,下面跟随小白系统一起深入了解下UEFI+GPT和Legacy+ ...
- onclick=两个函数_[译]React函数组件和类组件的差异
[译]React函数组件和类组件的差异 原文: https://overreacted.io/how-are-function-components-different-from-classes/ 在 ...
- legacy bios与uefi两种模式安装windows8操作系统的方法
在Legacy BIOS与UEFI 两种模式安装Windows 8操作系统的方法 作者:佚名 字体:[增加 减小] 来源:互联网 时间:01-10 16:18:23 我要评论 不是所有WIN8都可以安 ...
- python 分析两组数据的差异_R语言limma包差异基因分析(两组或两组以上)
使用limma包进行差异基因分析时,做最多的是两分类的,例如control组和disease组,但也会碰到按照序列进行的分组.这时,如果逐一使用两两比较求差异基因则略显复杂.其实开发limma包的大神 ...
- GDCM:读取两个DICOM文件保存在另外dicom文件中的测试程序
GDCM:读取两个DICOM文件保存在另外dicom文件中 GDCM:读取两个DICOM文件保存在另外dicom文件中 GDCM:读取两个DICOM文件保存在另外dicom文件中 #include & ...
- 【SQL Join】两个字段关联到同一个表,如何使用left join
Join 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 下面列出了您可以使用的 JOIN 类型,以及它们之间的差异. JOIN: 如果表中有至少一个匹配,则返 ...
最新文章
- 如何強迫 .Net 應用程式輸出英文的例外訊息
- winform 后台线程更新UI
- hpuoj--校赛--与学妹滑雪(最短路+精度判断)
- C语言中 *.c和*.h文件的区别!
- SAP License:MM模块审批策略问题
- 产品研发过程管理专题——编写软件测试计划需要考虑的几个问题
- redis的安装和命令的使用(史上最全命令集合)
- Mathtype使用技巧(一)
- EPLAN中如何画屏蔽双绞线
- Chrome谷歌浏览器连接路由器不上
- #读书笔记—《自控力》第一章
- 微信分享自定义图标大小限制_微信分享时安卓的自定义参数无效的解决办法
- 如何配置 Cilium 和 BGP 协同工作?
- python三维雷达图_Matplotlib绘制雷达图和三维图的示例代码
- tushare实战分析美元黄金与美债收益率、利率的关系
- java一元多项式减法运算_一元多项式的表示及加减乘除运算
- 使用howler做一个音频播放器到底有多简单
- 专精特新软件开发类企业实力指数发布,麒麟信安荣誉登榜
- 【蓝桥杯集训100题】scratch太极图 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第22题
- 数字化成熟度:迈出数字化转型的下一步
热门文章
- boot spring 获取请求端口浩_Spring精华问答 | 如何集成Spring Boot?
- linux系统调用记录模块实验报告,华科操作系统实验报告(DOC)
- File类的创建功能
- mysql 8.0 java连接报错:Unknown system variable 'query_cache_size'
- 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器
- 浅谈ASP.NET的内部机制(二)
- 同一个类里方法互相调用注解失效问题
- Protobuf生成Java代码(命令行)
- 获取access_token
- CSS 实现必填项前/后添加红色星号