c#多執行緒程式設計筆記2
第三部分執行緒的同步
同步的意思是在多執行緒程式中,為了使兩個或多個執行緒之間,對分配臨界資源的分配問題,要如何分配才能使臨界資源在為某一執行緒使用的時候,其它執行緒不能再使用,這樣可以有效地避免死鎖與髒資料。髒資料是指兩個執行緒同時使用某一資料,造成這個資料出現不可預知的狀態!在C#中,對執行緒同步的處理有如下幾種方法:
a)等待事件:當某一事件發生後,再發生另一件事。
例子3:
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
protected void ThreadOneMethod()
{
m_manualResetEvent.WaitOne();//在這裡是將入口為ThreadOneMethod的執行緒設為等待
m_protectedResource.Increment();
int iValue = m_protectedResource.Counter;
System.Console.WriteLine("{Thread one} - Current value of counter:"
}
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它允許執行緒之間互相發訊息。
結果如下: