最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#多線程同步lock、Mutex的實(shí)現(xiàn)

 更新時(shí)間:2024年05月30日 09:02:51   作者:豬豬加大碼力  
本文主要介紹了C#多線程同步lock、Mutex的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

C#使用多線程可以通過(guò)System.Threading命名空間下的Thread類來(lái)實(shí)現(xiàn)

lock和Mutex用于實(shí)現(xiàn)線程同步的機(jī)制:

上代碼:

    class People
    {
        public People(int idd)
        {
            id = idd;
        }
        public int id;
        public int age;
    }
    class TestHelper
    {
        public TestHelper() { }
        List<People> m_data = new List<People>();

        int m_iComplete;
        private void LockThread(object obj)
        {
            List<object> parameters = (List<object>)obj;
            int idx = (int)parameters[0];
            while (true)
            {
                People data = null;
                lock(this)
                {
                    if (m_iComplete >= m_data.Count)
                    {
                        return;
                    }
                    data = m_data[m_iComplete];
                    Interlocked.Increment(ref m_iComplete);

                    data.age = data.id;
                    Console.Write("======");
                    Console.WriteLine("id:" + data.id.ToString() + ",age:" + data.age.ToString());
                }

            }
        }

        //測(cè)試lock
        public void TestLock()
        {
            DateTime time1 = DateTime.Now;
            m_iComplete = 0;
            m_data.Clear();
            for (int i = 0; i < 10000;i++)
            {
                m_data.Add(new People(i + 1));
            }
            List<Thread> threads = new List<Thread>();
            for (int i = 0; i < Environment.ProcessorCount; i++)
            {
                Thread th = new Thread(LockThread);
                th.IsBackground = true;
                List<object> objs = new List<object>();
                objs.Add(i + 1);
                th.Start(objs);
                threads.Add(th);
            }
            foreach (var th in threads)
            {
                th.Join();
            }
            DateTime time2 = DateTime.Now;
            TimeSpan deltaTime = time2.Subtract(time1);
            Console.Write("===================耗時(shí): ");
            Console.WriteLine(deltaTime.TotalSeconds);
        }

        Mutex m_mutex = new Mutex();
        private void MutexThread(object obj)
        {
            List<object> parameters = (List<object>)obj;
            int idx = (int)parameters[0];
            while (true)
            {
                People data = null;
                //開啟
                m_mutex.WaitOne();
                if (m_iComplete >= m_data.Count)
                {
                    //釋放
                    m_mutex.ReleaseMutex();
                    return;
                }
                data = m_data[m_iComplete];

                Interlocked.Increment(ref m_iComplete);
                data.age = data.id;
                Console.Write("======");
                Console.WriteLine("id:" + data.id.ToString() + ",age:" + data.age.ToString());
                //釋放
                m_mutex.ReleaseMutex();
            }
        }
        //測(cè)試mutex
        public void TestMutex()
        {
            DateTime time1 = DateTime.Now;
            m_iComplete = 0;
            m_data.Clear();
            for (int i = 0; i < 10000; i++)
            {
                m_data.Add(new People(i + 1));
            }
            List<Thread> threads = new List<Thread>();
            for (int i = 0;i<Environment.ProcessorCount;i++)
            {
                Thread th = new Thread(MutexThread);
                List<object> objs = new List<object>();
                objs.Add(i + 1);
                th.Start(objs);
                threads.Add(th);                
            }
            foreach(var th in threads)
            {
            	//同步等待
                th.Join();
            }
            DateTime time2 = DateTime.Now;
            TimeSpan deltaTime = time2.Subtract(time1);
            int sec = (int)deltaTime.TotalSeconds;
            Console.Write("===================耗時(shí): ");
            Console.WriteLine(deltaTime.TotalSeconds);
        }
    }

測(cè)試:

在這里插入圖片描述

起多個(gè)線程計(jì)算:

在這里插入圖片描述

總結(jié):

1、Lock是C#中的關(guān)鍵字,用于對(duì)代碼塊進(jìn)行同步。Lock只能用于同一進(jìn)程內(nèi)的線程同步。輕量級(jí)的同步機(jī)制,開銷比較小,使用簡(jiǎn)單,不能用于跨應(yīng)用程序域的線程同步。
2、Mutex是系統(tǒng)級(jí)別的同步對(duì)象,用于跨進(jìn)程的線程同步。 Mutex是內(nèi)核對(duì)象,因此創(chuàng)建和銷毀代價(jià)高,用于跨應(yīng)用程序域的線程同步。

到此這篇關(guān)于C#多線程同步lock、Mutex的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C#多線程同步lock、Mutex內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

巴林左旗| 襄垣县| 江西省| 富民县| 汾阳市| 峨山| 句容市| 方城县| 班戈县| 彰化市| 中西区| 博乐市| 南陵县| 讷河市| 博客| 大厂| 东明县| 游戏| 开阳县| 隆回县| 宁安市| 饶阳县| 若尔盖县| 平顶山市| 黑河市| 原平市| 洛浦县| 东丰县| 旬邑县| 吉林省| 灵山县| 府谷县| 岱山县| 五指山市| 农安县| 新闻| 眉山市| 富宁县| 汶川县| 原阳县| 大余县|