1. 程式人生 > >c#多執行緒程式設計筆記2

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

(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它允許執行緒之間互相發訊息。

結果如下: