最佳线程队列示例/最佳实践

38

我有需要在特定后台线程上执行的数据。来自所有其他线程的代码都需要调用此数据。是否有关于使用队列进行同步以支持此线程要求的良好教程或最佳实践?


5个回答

34

1
你提供的关于线程的Albahari链接是非常好的资源。 - CaptainBli

10

第一个链接中的代码示例不建议使用,因为它可能存在竞态条件,导致信号丢失。不要使用它! - Hugh Jeffner

5

1

我最喜欢的解决方案之一类似于生产者/消费者模式。

我创建了一个主线程(几乎就是我的程序的Main()),它拥有一个阻塞队列对象。

这个主线程产生多个工作线程,简单地从中央阻塞线程弹出并处理任务。因为它是一个线程安全的阻塞队列,同步位很容易--TaskQueue.Dequeue()调用将阻塞,直到生产者/主线程入队一个任务为止。

您可以动态管理您想要的工作线程数或根据配置变量进行修复--因为它们只是从队列中弹出东西,所以工作线程的数量不会增加任何复杂性。

在我的情况下,我有一个服务来处理若干不同类型的任务。我让队列类型化以处理像TaskQueueTask这样的通用内容。然后,我会子类化它并覆盖Execute()方法。


我也尝试过使用.NET线程池的方法,可以轻松地将任务投入池中。这种方法非常简单易用,但同时也提供了很少的控制,无法保证执行顺序、时间等方面的问题。因此,它仅适用于轻量级任务。

这是一个阻塞队列:http://www.eggheadcafe.com/articles/20060414.asp - Michael Haren

0

现在两个链接都无效了。 - Lichader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接