也談並行計算(一)C#版的Parallel.For實現

來源:互聯網
上載者:User

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;        }    }}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.