C#多線程同步lock、Mutex的實(shí)現(xiàn)
C#使用多線程可以通過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)文章
C#實(shí)現(xiàn)DataTable轉(zhuǎn)換成IList的方法
這篇文章主要介紹了C#實(shí)現(xiàn)DataTable轉(zhuǎn)換成IList的方法,涉及C#針對(duì)DataTable操作的相關(guān)技巧,需要的朋友可以參考下2016-03-03unity中點(diǎn)擊某一個(gè)按鈕播放某一個(gè)動(dòng)作的操作
這篇文章主要介紹了unity中點(diǎn)擊某一個(gè)按鈕播放某一個(gè)動(dòng)作的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-04-04C#對(duì)圖片進(jìn)行馬賽克處理可控制模糊程度的實(shí)現(xiàn)代碼
本文通過實(shí)例代碼給大家介紹了C#對(duì)圖片進(jìn)行馬賽克處理可控制模糊程度的實(shí)現(xiàn)方法,代碼超簡(jiǎn)單,具有一定的參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05C#開發(fā)微信門戶及應(yīng)用(1) 微信接口使用
這篇文章主要為大家詳細(xì)介紹了C#開發(fā)微信門戶及應(yīng)用第一篇,微信接口的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06C#中使用Join與GroupJoin將兩個(gè)集合進(jìn)行關(guān)聯(lián)與分組
這篇文章主要介紹了C#中使用Join與GroupJoin將兩個(gè)集合進(jìn)行關(guān)聯(lián)與分組,文中分別對(duì)Join和GroupJoin的用法進(jìn)行詳細(xì)說明,需要的朋友可以參考下2017-12-12C#通過XML節(jié)點(diǎn)屬性/屬性值讀取寫入XML操作代碼實(shí)例
本文主要介紹C#通過XML節(jié)點(diǎn)屬性、屬性值對(duì)XML的讀取,寫入操作,大家參考使用吧2013-11-11C#實(shí)現(xiàn)以管理員方式啟動(dòng)程序的多種方法
在Windows應(yīng)用程序開發(fā)的領(lǐng)域中,C#語(yǔ)言憑借其強(qiáng)大的功能和廣泛的適用性,被眾多開發(fā)者所青睞,然而,在實(shí)際的開發(fā)過程里,我們常常會(huì)遭遇程序需要訪問特定的系統(tǒng)資源,像是系統(tǒng)文件夾、注冊(cè)表項(xiàng)等,在接下來(lái)的內(nèi)容中,我將為大家介紹在C#中實(shí)現(xiàn)以管理員方式啟動(dòng)程序的多種方法2025-01-01