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

