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());
}
}
}
//测试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只能用于同一进程内的线程同步。轻量级的同步机制,开销比较小,使用简单,不能用于跨应用程序域的线程同步。
2、Mutex是系统级别的同步对象,用于跨进程的线程同步。 Mutex是内核对象,因此创建和销毁代价高,用于跨应用程序域的线程同步。