线程与并行处理

Ice*_*ind 33 .net parallel-processing multithreading

Microsoft .NET 4.0为其框架引入了新的"并行增强".我想知道使用标准System.Threading函数的应用程序与新的并行增强功能之间的区别.

Aar*_*ght 40

并行扩展和常规线程之间最重要的区别可能是控制流.

使用new Thread(...)ThreadPool.QueueUserWorkItem将在完全不确定的时间点终止的线程.如果你写这个代码:

ThreadPool.QueueUserWorkItem(() =>
    {
        Thread.Sleep(1000);
        Console.WriteLine("Work Finished");
    });
Console.WriteLine("Item Queued");
Run Code Online (Sandbox Code Playgroud)

文本Item Queued将立即显示,并Work Finished在大约1秒延迟后打印.

另一方面,如果使用并行扩展编写类似的东西:

Parallel.For(0, 10, i =>
    {
        Thread.Sleep(1000);
        Console.WriteLine("Test {0}", i);
    });
Console.WriteLine("Finished");
Run Code Online (Sandbox Code Playgroud)

在这种情况下你会看到的是在发生任何事情之前延迟1秒,然后是随机顺序的一系列"测试"消息,然后是文本Finished.

换句话说,并行运行任务实际上并不会改变程序流程.它将在不同的线程上运行不同的任务,以便它们可以在多个CPU内核上执行,以提高程序的整体吞吐量,但就典型的程序员而言,这些任务并未真正在"后台运行" "因为他们将与一个线程.您无需更改程序的结构或执行任何特殊操作即可在工作完成时收到通知.您无法控制并行块内部发生的情况,但您知道在完成所有并行任务之前块不会返回控制.

虽然Parallel Extensions非常适用于此,但是当你真正需要在后台运行任务时,例如实现调度程序,或者委托给工作线程以保持UI响应时,PX没有任何用处.您仍然需要使用线程或异步组件.