最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中的lock、Monitor、Mutex學習筆記

 更新時間:2015年01月20日 10:51:07   投稿:junjie  
這篇文章主要介紹了C#中的lock、Monitor、Mutex學習筆記,本文講解的都是線程同步的一些知識,需要的朋友可以參考下

線程:線程是進程的獨立執(zhí)行單元,每一個進程都有一個主線程,除了主線程可以包含其他的線程。

多線程的意義:多線程有助于改善程序的總體響應性,提高CPU的效率。

多線程的應用程序域是相當不穩(wěn)定的,因為多個線程在同一時間內(nèi)都能運行共享的功能模塊。為了保護應用程序的資源不被破壞,為多線程程序提供了三種加鎖的機制,分別是:Monitor類、Lock關鍵字和Mutex類。

1. lock

lock實現(xiàn)的功能是:使后進入的線程不會中斷當前的線程,而是等待當前線程結束后再繼續(xù)執(zhí)行。

應用:

復制代碼 代碼如下:

   private Object thisLock=new object();

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

注意:避免鎖定 public 類型,否則實例將超出代碼的控制范圍。

常見的結構 lock (this)、lock (typeof (MyType)) 和 lock ("myLock")
違反此準則:如果實例可以被公共訪問,將出現(xiàn) lock (this) 問題。
如果 MyType 可以被公共訪問,將出現(xiàn) lock (typeof (MyType)) 問題。
由于進程中使用同一字符串的任何其他代碼將共享同一個鎖,所以出現(xiàn) lock(“myLock”) 問題。
最佳做法是定義 private 對象來鎖定, 或 private static 對象變量來保護所有實例所共有的數(shù)據(jù)。
下面舉例說明lock的應用:
下面的例子中創(chuàng)建了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:沒有l(wèi)ock    

從實驗結果可以看出,加lock后,程序每次只能執(zhí)行一個線程,只有當前線程執(zhí)行完了,才會執(zhí)行下一個線程未加lock,程序執(zhí)行混亂,容易阻塞。

2. Monitor

lock是對Monitor的Enter和Exit的一個封裝,因此Monitor類的Enter()和Exit()方法的組合使用可以用lock關鍵字替代。

Monitor類除了具有l(wèi)ock的功能外,還有以下功能:

TryEnter()解決長期死等的問題,如果一個并發(fā)經(jīng)常發(fā)生,并且持續(xù)時間很長,使用TryEnter,可以有效防止死鎖或者長時間 的等待。    

Wait()釋放對象上的鎖,以便允許其他線程鎖定和訪問該對象。在其他線程訪問對象時,調(diào)用線程將等待。脈沖信號用于通知等待線程有關對象狀態(tài)的更改。

Pulse(),PulseAll()向一個或多個等待線程發(fā)送信號。該信號通知等待線程鎖定對象的狀態(tài)已更改,并且鎖的所有者準備釋放該鎖。等待線程被放置在對象的就緒隊列中以便它可以最后接收對象鎖。一旦線程擁有了鎖,它就可以檢查對象的新狀態(tài)以查看是否達到所需狀態(tài)。

注意:Pulse、PulseAll和Wait方法必須從同步的代碼塊內(nèi)調(diào)用。

3. Mutex(互斥體)

Mutex的突出特點是可以跨應用程序域邊界對資源進行獨占訪問,即可以用于同步不同進程中的線程,這種功能是以犧牲更多的系統(tǒng)資源為代價的。    

互斥體Mutex和事件對象EventWaitHandler屬于內(nèi)核對象,利用內(nèi)核對象進行線程同步,線程必須要在用戶模式和內(nèi)核模式間切換,所以一般效率很低,但利用互斥對象和事件對象這樣的內(nèi)核對象,可以在多個進程中的各個線程間進行同步。

互斥體Mutex類似于一個接力棒,拿到接力棒的線程才可以開始跑,當然接力棒一次只屬于一個線程(Thread Affinity),如果這個線程不釋放接力棒(Mutex.ReleaseMutex),那么其他所有需要接力棒運行的線程只能等著看熱鬧。

相關文章

  • C#?網(wǎng)域賬號(Domain)驗證的實現(xiàn)

    C#?網(wǎng)域賬號(Domain)驗證的實現(xiàn)

    本文主要介紹了C#?網(wǎng)域賬號(Domain)驗證的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-04-04
  • C#使用 NAudio 實現(xiàn)音頻可視化的方法

    C#使用 NAudio 實現(xiàn)音頻可視化的方法

    這篇文章主要介紹了[C#] 使用 NAudio 實現(xiàn)音頻可視化的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Unity實現(xiàn)粒子光效導出成png序列幀

    Unity實現(xiàn)粒子光效導出成png序列幀

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)粒子光效導出成png序列幀,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 一篇文章帶你輕松了解C# Lock關鍵字

    一篇文章帶你輕松了解C# Lock關鍵字

    這篇文章主要給大家介紹了如何通過一篇文章帶你輕松了解C# Lock關鍵字的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C#具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-06-06
  • c#防止多次運行代碼收集分享

    c#防止多次運行代碼收集分享

    原文:經(jīng)過我的測試,還比較好用,但是有個問題,如果不注銷,用另一個用戶進入,則程序不能判斷出已運行。所以只限于用在單用戶環(huán)境,還是不太完美
    2013-09-09
  • 談談C# replace在正則表達式中的意義

    談談C# replace在正則表達式中的意義

    這篇文章主要介紹了C# replace在正則表達式中的意義的相關資料,需要的朋友可以參考下
    2016-03-03
  • C#(.net)中按字節(jié)數(shù)截取字符串最后出現(xiàn)亂碼問題的解決

    C#(.net)中按字節(jié)數(shù)截取字符串最后出現(xiàn)亂碼問題的解決

    這篇文章主要給大家介紹了關于C#(.net)中按字節(jié)數(shù)截取字符串最后出現(xiàn)亂碼問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • C#之WinForm WebBrowser實用技巧匯總

    C#之WinForm WebBrowser實用技巧匯總

    這篇文章主要介紹了C#之WinForm WebBrowser實用技巧匯總,包括常見的各種設置及信息獲取等,需要的朋友可以參考下
    2014-08-08
  • c#入門之枚舉和結構體使用詳解(控制臺接收字符串以相反的方向輸出)

    c#入門之枚舉和結構體使用詳解(控制臺接收字符串以相反的方向輸出)

    這篇文章主要介紹了c#入門之枚舉和結構體使用詳解,最后提供了編寫控制臺應用程序接收字符串并做相應處理的小示例,需要的朋友可以參考下
    2014-04-04
  • Unity Shader實現(xiàn)水波紋效果

    Unity Shader實現(xiàn)水波紋效果

    這篇文章主要為大家詳細介紹了Unity Shader實現(xiàn)水波紋效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評論

三原县| 临泽县| 万宁市| 绥阳县| 凌海市| 新营市| 柳林县| 大厂| 彝良县| 巴林右旗| 泽普县| 海阳市| 山东省| 黔南| 高陵县| 固始县| 镇平县| 海淀区| 阿巴嘎旗| 禄丰县| 晋江市| 唐海县| 长汀县| 宣城市| 马边| 辽源市| 花垣县| 霍城县| 云林县| 抚顺县| 永泰县| 永嘉县| 兰坪| 诸暨市| 延安市| 晋城| 苏尼特左旗| 龙岩市| 樟树市| 泰宁县| 岢岚县|