Parallel.For可以算是並行計算的基石了,有了他可以解決90%以上的並行計算問題。當然了,他的實現實在是簡單的不值一提,先發一個我寫的C#實現,下回我們就以它為基礎來講解如何?並行計算。對於已經使用.net 4.0的同學請自動無視該實現。
static class Parallel{ public delegate void Kernel(); public delegate void KernelFor(int index); [ThreadStaticAttribute] static int currId; class Worker { int id; EventWaitHandle[] events = new EventWaitHandle[2]; public EventWaitHandle endEvent = new EventWaitHandle(false, EventResetMode.AutoReset); Thread thread; Kernel kernel; void Start() { Parallel.currId = id; while(true) { int ret = EventWaitHandle.WaitAny(events, -1); if(ret == 0) { kernel(); endEvent.Set(); } else break; } } public Worker(int i) { id = i; events[0] = new EventWaitHandle(false, EventResetMode.AutoReset); events[1] = new EventWaitHandle(false, EventResetMode.AutoReset); thread = new Thread(new ThreadStart(this.Start)); thread.Start(); } public void Exit() { events[1].Set(); thread.Join(); } public void Run(Kernel kernel) { this.kernel = kernel; events[0].Set(); } } static Worker[] workers; static WaitHandle[] endEvents; static public void Initialize(int maxThread) { if(maxThread <= 0) maxThread = Environment.ProcessorCount; workers = new Worker[maxThread]; endEvents = new WaitHandle[maxThread]; for(int i = 0; i < workers.Length; ++i) { workers[i] = new Worker(i); endEvents[i] = workers[i].endEvent; } } static public void Destroy() { for(int i = 0; i < workers.Length; ++i) workers[i].Exit(); } static public void For(int from, int to, KernelFor kernel) { int index = from; for(int i = 0; i < workers.Length; ++i) workers[i].Run(delegate() { while(true) { int j = Interlocked.Increment(ref index); if(j >= to) break; kernel(j - 1); } }); WaitHandle.WaitAll(endEvents); } static public int WorkerCount { get { return workers.Length; } } static public int CurrentWorkerId { get { return currId; } }}