C#多線程同步lock、Mutex的實現(xiàn)
C#使用多線程可以通過System.Threading命名空間下的Thread類來實現(xiàn)
lock和Mutex用于實現(xiàn)線程同步的機制:
上代碼:
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());
}
}
}
//測試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("===================耗時: ");
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();
}
}
//測試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("===================耗時: ");
Console.WriteLine(deltaTime.TotalSeconds);
}
}
測試:

起多個線程計算:

總結:
1、Lock是C#中的關鍵字,用于對代碼塊進行同步。Lock只能用于同一進程內(nèi)的線程同步。輕量級的同步機制,開銷比較小,使用簡單,不能用于跨應用程序域的線程同步。
2、Mutex是系統(tǒng)級別的同步對象,用于跨進程的線程同步。 Mutex是內(nèi)核對象,因此創(chuàng)建和銷毀代價高,用于跨應用程序域的線程同步。
到此這篇關于C#多線程同步lock、Mutex的實現(xiàn)的文章就介紹到這了,更多相關C#多線程同步lock、Mutex內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#實現(xiàn)DataTable轉換成IList的方法
這篇文章主要介紹了C#實現(xiàn)DataTable轉換成IList的方法,涉及C#針對DataTable操作的相關技巧,需要的朋友可以參考下2016-03-03
C#對圖片進行馬賽克處理可控制模糊程度的實現(xiàn)代碼
本文通過實例代碼給大家介紹了C#對圖片進行馬賽克處理可控制模糊程度的實現(xiàn)方法,代碼超簡單,具有一定的參考借鑒價值,感興趣的朋友跟隨腳本之家小編一起學習吧2018-05-05
C#中使用Join與GroupJoin將兩個集合進行關聯(lián)與分組
這篇文章主要介紹了C#中使用Join與GroupJoin將兩個集合進行關聯(lián)與分組,文中分別對Join和GroupJoin的用法進行詳細說明,需要的朋友可以參考下2017-12-12
C#通過XML節(jié)點屬性/屬性值讀取寫入XML操作代碼實例
本文主要介紹C#通過XML節(jié)點屬性、屬性值對XML的讀取,寫入操作,大家參考使用吧2013-11-11

