2010-03-06 49 views
1

一个从Managed Threading Best Practices片断MSDN上:这里描述了什么多线程范例?

(使用事件,例如)不控制工作线程的从你的主程序执行。相反,设计你的程序,以便工作线程负责等待工作可用,执行它并在完成时通知程序的其他部分。如果您的工作线程不阻塞,请考虑使用线程池线程。 Monitor .. ::。PulseAll在工作线程阻塞的情况下非常有用。

我想知道这是什么描述,所以我可以搜索基本实现开始使用。

回答

2

什么段的意思是说:

假设你有,你有一个消费者线程生产者 - 消费者问题。如果你有一个专用的线程(非ThreadPool),那么你应该使用WaitHandle :: WaitOne调用来使该线程等待,直到你有处理的东西(可能在一个进程队列中)。当生产者完成队列填充时,它可以调用WaitHandle :: Set()来通知你线程开始处理队列。 WaitOne()用于专用线程,因为每次要处理队列时创建新的专用线程都会很昂贵。

DoProcessQueue() 
{ 
    while(RUNTHREAD) 
    { 
     ... process queue items 

     waitHandle.WaitOne(); // will wiat here until producer thread calls Set() 
    } 
} 

线程池线程被推荐用于小任务,所以如果你打算使用了WaitOne(),那么你不应该使用线程池线程,因为线程池可用于各种应用和全球资源阻断池中的线程是不是一个好的选择。

0

听起来像一个工作池。

多线程等待共享工作队列,执行任务,执行它们,并通过共享同步变量将它们发送到程序的其他部分。

基本语义是MVar或其他asynchronous channel

0

这听起来像是一种分散的“基于代理”的方法。

编写多线程代码的“传统”方式有点像工作中的微观管理 - 老板提出了所有的工作,并且所有其他人都期待着等待给予他们。团队成员之间需要传递的任何工作都是通过老板传递的。

基于代理的方法就像是让团队中的每个人都能够找到并完成工作,并根据需要在团队成员之间传递工作。老板知道发生了什么,但只有执行监督角色。