并发软件设计

Concurrent Software Design

我有一个软件项目需要与不同的网络主机通信并对 UI 事件、来自不同套接字的各种网络消息、计时器等事件作出反应,...

我的问题是我找不到令人满意的解决方案来确保线程安全,同时仍然提供非阻塞方法。我有 类 那种相互依赖的东西,在我的想象中,我看到很多线程 运行 通过我的 类 的方法不受控制的越野。所以我必须为所有东西创建锁。

我认为通过添加太多的锁,我的​​方法几乎可以像阻塞方法一样运行并产生像死锁这样的错误。

我需要使用 .NET 3.5,但我很好奇在任何语言/框架中对此的解决方案是什么样的(也许使用 .Net > 3.5 是解决方案?)

起初我试着想象使用 Begin...() 方法创建的线程的流程。所以我的第一个方法是定义一个充满线程的手来维护我的应用程序的某个部分(例如网络线程,事件线程,...)。这样我理论上可以减少锁的需要,因为资源被绑定到它们唯一的一个线程。

由于这些线程必须关心不同的操作,我尝试实现自己的事件队列(参见 How to implement a message pump in Non-UI thread in .NET?),但感觉如果 .Net 至少没有为此目的提供某种模式,那么可能是解决这些问题的更好方法。

我一直在阅读有关设计模式等的所有 MSDN 页面,这很有帮助,但我仍然看不到全貌。

我认为这是 .Net 或一般并发编程中的常见场景。也许我只是没有看到就在我面前的解决方案。如果是这样,如果有人能指出我正确的方向,我会很高兴。

这是一个复杂的话题,很难解释。希望我能提供足够的信息。有什么不明白的请追问。

感谢您的帮助。

我发现 producer/consumer pattern 很有用。基本上,您可以拥有不对称数量的生产者和消费者,例如,您可以让多个线程为一个队列提供数据,而只有一个线程使用它们;或多个线程竞争处理队列中的消息。

How to: Implement a Producer-Consumer Dataflow Pattern

在你的情况下,来自套接字和 UI 事件的消息将是需要处理的数据片段,那么你可以有一个线程(在你的情况下可能是 UI 线程) 从该队列中读取,并在 UI 上执行操作。这样,该线程就不需要锁定所有内容。