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

C#中的lock、Monitor、Mutex進修筆記

編輯:C#入門知識

C#中的lock、Monitor、Mutex進修筆記。本站提示廣大學習愛好者:(C#中的lock、Monitor、Mutex進修筆記)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中的lock、Monitor、Mutex進修筆記正文


線程:線程是過程的自力履行單位,每個過程都有一個主線程,除主線程可以包括其他的線程。

多線程的意義:多線程有助於改良法式的整體呼應性,進步CPU的效力。

多線程的運用法式域是相當不穩固的,由於多個線程在統一時光內都能運轉同享的功效模塊。為了掩護運用法式的資本不被損壞,為多線程法式供給了三種加鎖的機制,分離是:Monitor類、Lock症結字和Mutex類。

1. lock

lock完成的功效是:使落後入的線程不會中止以後的線程,而是期待以後線程停止後再持續履行。

運用:

   private Object thisLock=new object();

   lock(thisLock){
               //鎖定的代碼塊
    }

留意:防止鎖定 public 類型,不然實例將超越代碼的掌握規模。

罕見的構造 lock (this)、lock (typeof (MyType)) 和 lock ("myLock")
違背此原則:假如實例可以被公共拜訪,將湧現 lock (this) 成績。
假如 MyType 可以被公共拜訪,將湧現 lock (typeof (MyType)) 成績。
因為過程中應用統一字符串的任何其他代碼將同享統一個鎖,所以湧現 lock(“myLock”) 成績。
最好做法是界說 private 對象來鎖定, 或 private static 對象變量來掩護一切實例所共有的數據。
上面舉例解釋lock的運用:
上面的例子中創立了5個次線程,次線程完成的義務就是:輸入線程編碼,延遲1秒,然後輸入其時的時光

Example:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication5 {
    class Program {
        static void Main(string[] args) {
        Console.WriteLine ("法式開端時光:"+DateTime.Now .ToString());
        Example ex=new Example ();
        Thread []threads=new  Thread[5];
        for (int i=0;i<5;i++)
        {
        threads[i]=new Thread (new ThreadStart(ex.OutPut));
        threads[i].Name =string.Format ("Worker thread#{0}",i) ;
        }
        foreach(Thread t in threads){
        t.Start();
        }
        Console.WriteLine("主線程最初一句代碼!"+DateTime.Now.ToString());
        }
    }
    class Example{
    private static object  thisLock=new object ();
    public void OutPut()
    {   
    lock(thisLock){
    Console .WriteLine("->{0}",Thread.CurrentThread.Name);
    Thread.Sleep(1000);
    Console.WriteLine(DateTime.Now);
    }
    }
   
    }
}

試驗成果以下:

           圖1:加lock

      圖2:沒有lock    

從試驗成果可以看出,加lock後,法式每次只能履行一個線程,只要以後線程履行完了,才會履行下一個線程未加lock,法式履行凌亂,輕易壅塞。

2. Monitor

lock是對Monitor的Enter和Exit的一個封裝,是以Monitor類的Enter()和Exit()辦法的組合應用可以用lock症結字替換。

Monitor類除具有lock的功效外,還有以下功效:

TryEnter()處理歷久逝世等的成績,假如一個並發常常產生,而且連續時光很長,應用TryEnter,可以有用避免逝世鎖或許長時光 的期待。    

Wait()釋放對象上的鎖,以便許可其他線程鎖定和拜訪該對象。在其他線程拜訪對象時,挪用線程將期待。脈沖旌旗燈號用於告訴期待線程有關對象狀況的更改。

Pulse(),PulseAll()向一個或多個期待線程發送旌旗燈號。該旌旗燈號告訴期待線程鎖定對象的狀況已更改,而且鎖的一切者預備釋放該鎖。期待線程被放置在對象的停當隊列中以便它可以最初吸收對象鎖。一旦線程具有了鎖,它便可以檢討對象的新狀況以檢查能否到達所需狀況。

留意:Pulse、PulseAll和Wait辦法必需從同步的代碼塊內挪用。

3. Mutex(互斥體)

Mutex的凸起特色是可以跨運用法式域界限對資本停止獨有拜訪,便可以用於同步分歧過程中的線程,這類功效是以就義更多的體系資本為價值的。    

互斥體Mutex和事宜對象EventWaitHandler屬於內查對象,應用內查對象停止線程同步,線程必需要在用戶形式和內核形式間切換,所以普通效力很低,但應用互斥對象和事宜對象如許的內查對象,可以在多個過程中的各個線程間停止同步。

互斥體Mutex相似於一個接力棒,拿到接力棒的線程才可以開端跑,固然接力棒一次只屬於一個線程(Thread Affinity),假如這個線程不釋放接力棒(Mutex.ReleaseMutex),那末其他一切須要接力棒運轉的線程只能等著看熱烈。

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