程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#線程的同步

c#線程的同步

編輯:C#入門知識

同步的意思是在多線程程序中,為了使兩個或多個線程之間,對分配臨界資源的分配問題,要如何分配才能使臨界資源在為某一線程使用的時候,其它線程不能再使用,這樣可以有效地避免死鎖與髒數據。髒數據是指兩個線程同時使用某一數據,造成這個數據出現不可預知的狀態!在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
 
 

作者:szstephenzhou

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved