C#使用多线程可以通过System.Threading命名空间下的Thread类来实现
lock和Mutex用于实现线程同步的机制:
上代码:
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());}}}//测试lockpublic 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();}}//测试mutexpublic 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只能用于同一进程内的线程同步。轻量级的同步机制,开销比较小,使用简单,不能用于跨应用程序域的线程同步。
2、Mutex是系统级别的同步对象,用于跨进程的线程同步。 Mutex是内核对象,因此创建和销毁代价高,用于跨应用程序域的线程同步。