这里描述了什么多线程范例?

时间:2010-03-06 06:39:45

标签: .net multithreading c++-cli

MSDN上Managed Threading Best Practices的摘录:

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

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

3 个答案:

答案 0 :(得分:2)

摘录的含义是:

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

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

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

建议ThreadPool线程用于小任务,因此如果您打算使用WaitOne(),则不应使用ThreadPool线程,因为ThreadPool是每个应用程序都可用的全局资源,阻塞池线程不是一个好选择。

答案 1 :(得分:0)

听起来像是一个工作池。

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

基本语义是MVar或其他asynchronous channel的基本语义。

答案 2 :(得分:0)

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

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

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