同步的意思是在多線程程序中,為了使兩個或多個線程之間,對分配臨界資源的分配問題,要如何分配才能使臨界資源在為某一線程使用的時候,其它線程不能再使用,這樣可以有效地避免死鎖與髒數據。髒數據是指兩個線程同時使用某一數據,造成這個數據出現不可預知的狀態!在C#中,對線程同步的處理有如下幾種方法: 等待事件:當某一事件發生後,再發生另一件事。
[csharp]
<pre class="html" name="code">using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
public class ClassCounter
{
protected int m_iCounter = 0;
public void Increment()
{
m_iCounter++;
}
public int Counter
{
get
{
return m_iCounter;
}
}
}
public class EventClass
{
protected ClassCounter m_protectedResource = new ClassCounter();
protected ManualResetEvent m_manualResetEvent = new ManualResetEvent(false);//ManualResetEvent(initialState),initialState如果為true,則將初始狀態設置為終止;如果為false,則將初始狀態設置為非終止。
protected void ThreadOneMethod()
{
m_manualResetEvent.WaitOne();//在這裡是將入口為ThreadOneMethod的線程設為等待
m_protectedResource.Increment();
int iValue = m_protectedResource.Counter;
System.Console.WriteLine("{Thread one} - Current value of counter:" + iValue.ToString());
}
protected void ThreadTwoMethod()
{
int iValue = m_protectedResource.Counter;
Console.WriteLine("{Thread two}-current value of counter;" + iValue.ToString());
m_manualResetEvent.Set();//激活等待的線程
}
static void Main()
{
EventClass exampleClass = new EventClass();
Thread threadOne = new Thread(new ThreadStart(exampleClass.ThreadOneMethod));
Thread threadTwo = new Thread(new ThreadStart(exampleClass.ThreadTwoMethod));
threadOne.Start();//請注意這裡,這裡是先執行線程1
threadTwo.Start();//再執行線程2,那麼線程2的值應該比線程1大,但結果相反
Console.ReadLine();
}
}
}
ManualResetEvent它允許線程之間互相發消息。
結果如下:
{Thread two}-current value of counter;0
{Thread one} - Current value of counter:1