是否有可能规定使用RPC回调线程?

时间:2013-07-15 15:55:10

标签: com com-interop

我正在处理与非托管MTA COM对象相关的错误。该对象具有Lock和Unlock方法,并使用一个互斥锁,该互斥锁需要调用Lock的同一线程才能调用Unlock。

问题是当从托管STA线程调用Lock和Unlock(使用COM interop)时,调用进入RPC回调线程上的COM对象,但所使用的回调线程并不总是相同调用。当它不相同时,解锁调用失败,因为它无法解锁互斥锁。

换句话说:

托管STA线程1 - > RPC回调(线程11) - >锁

托管STA线程1 - > RPC回调(线程12) - >解锁 - >错误

我正在尝试在对修复做出任何决定之前评估所有可能的解决方案。因此,我试图找出:

1)是否有办法防止首先使用RPC回调线程?在我的测试中,如果我从一个非托管的STA线程调用该对象,调用似乎进入调用线程本身。当来自.Net的呼叫需要使用RPC回调线程时有什么不同?有没有办法阻止使用RPC回调? (除了使用MTA调用线程)

2)如果没有,是否有办法强制从同一个托管STA线程使用一致的RPC回调线程?

1 个答案:

答案 0 :(得分:1)

这是针对自由线程服务器的设计。 COM接受你的话,并允许存根使用任意RPC线程。您不能对线程标识做任何假设,从池中挑选RPC线程并进行回收。不幸的是,当调用序列时它经常会选择相同的一个,所以它看起来好像最初工作正常。但是,只要进行多个并发服务器调用,就会启动故障。没有选择让它具有选择性,一个自由线程服务器承诺不关心。在实践中也不能很好地工作,它可能会出现可怕的扩展或导致死锁。

因此,您无法使用互斥锁实现锁定,它具有线程关联性。信号量是一个不错的选择。