1

我有一个本地的Visual C++ COM对象,我需要使它完全线程安全才能在系统注册表中合法地将其标记为“自由线程”。具体而言,我需要确保不超过一个线程同时访问对象的任何成员变量。这会使对象线程安全吗?

问题是我几乎可以肯定,我的COM对象的任何理智的使用者都不会尝试同时使用来自多个线程的对象。所以我希望解决方案尽可能简单,只要符合上述要求即可。

这是我想出来的。我添加一个互斥或临界区作为对象的成员变量。每个COM暴露的方法都会在返回控制之前在开始和释放时获取互斥锁/节。

我明白,这个解决方案不提供细粒度的访问,这可能会减慢执行速度,但因为我想同时访问不会真的发生,我不在乎这一点。

此解决方案是否足够?有一个更简单的解决方案吗?

+0

如果您确定不会发生并发访问,为什么要使它安全?是否将它标记为自由线程有任何技术含义,或者您是否试图做到这一点只是为了确保? – Marek 2010-03-12 09:33:04

+0

@Marek:Yeap,我需要将它标记为自由线程以避免COM强制执行编组。我很乐意将它标记为单元线程。 – sharptooth 2010-03-12 09:48:07

回答

3

该解决方案应该可以工作,但是我建议在关键部分使用互斥锁,因为它们处理超时,在死锁情况下提供某种程度的回退。您还需要非常小心,锁定互斥锁的函数不会调用已经在同一个线程中锁定相同互斥锁的另一个函数。这对你的COM接口不应该是一个问题,只要你不在接口的互斥量之上添加额外的功能。如果COM包含回叫,您可能会遇到问题。

3

如果您确定实际的并发访问不会在实践中发生,那么忽略整个执行并不是一种不合理的方法。