我有一个原生的Visual C ++ COM对象,我需要使它完全是线程安全的,才能在系统注册表中合法地将其标记为“自由线程”。具体来说,我需要确保只有一个线程可以同时访问该对象的任何成员变量。
问题是我几乎可以确定我的COM对象的任何理智消费者都不会尝试同时使用来自多个线程的对象。所以我希望解决方案尽可能简单,只要它符合上述要求。
这就是我想出的。我添加了一个互斥或临界区作为对象的成员变量。每个暴露于COM的方法都将在开始时获取互斥锁/部分,并在返回控制之前释放。
据我所知,此解决方案不提供细粒度访问,这可能会降低执行速度,但由于我认为同时访问不会真正发生,所以我不关心这一点。
此解决方案是否足够?有更简单的解决方案吗?
答案 0 :(得分:3)
如果你确定在实践中不会发生实际的并发访问,那么静音整个执行并不是一种不合理的方法。
答案 1 :(得分:3)
这个解决方案应该可行,但我建议在关键部分处理超时,因为它们会处理超时,这会在出现死锁的情况下提供一定程度的回退。您还需要非常小心锁定互斥锁的函数不会调用已在同一线程中锁定相同互斥锁的另一个函数。这不应该是您的COM接口的问题,只要您不在互斥体上添加额外的功能到接口。如果COM包含回调,您可能会遇到问题。