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

c# volatile 關(guān)鍵字的拾遺補漏

 更新時間:2020年10月28日 09:02:11   作者:精致碼農(nóng) • 王亮  
這篇文章主要介紹了c# volatile 關(guān)鍵字的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#的相關(guān)知識,感興趣的朋友可以了解下

要理解 C# 中的 volatile 關(guān)鍵字,就要先知道編譯器背后的一個基本優(yōu)化原理。比如對于下面這段代碼:

public class Example
{
 public int x;
 public void DoWork()
 {
  x = 5;
  var y = x + 10;
  Debug.WriteLine("x = " +x + ", y = " +y);
 }
}

在 Release 模式下,編譯器讀取 x = 5 后緊接著讀取 y = x + 10,在單線程思維模式下,編譯器會認(rèn)為 y 的值始終都是 15。所以編譯器會把 y = x + 10 優(yōu)化為 y = 15,避免每次讀取 y 都執(zhí)行一次 x + 5。但 x 字段的值可能在運行時被其它的線程修改,我們拿到的 y 值并不是通過最新修改的 x 計算得來的,y 的值永遠(yuǎn)都是 15。

也就是說,編譯器在 Release 模式下會對字段的訪問進行優(yōu)化,它假定字段都是由單個線程訪問的,把與該字段相關(guān)的表達(dá)式運算結(jié)果編譯成常量緩存起來,避免每次訪問都重復(fù)運算。但這樣就可能導(dǎo)致其它線程修改了字段值而當(dāng)前線程卻讀取不到最新的字段值。為了防止編譯器這么做,你就要讓編譯器用多線程思維去解讀代碼。告訴編譯器字段的值可能會被其它線程修改,這種情況不要使用優(yōu)化策略。而要做到這一點,就需要使用 volatile 關(guān)鍵字。

給類的字段添加 volatile 關(guān)鍵字,目的是告訴編譯器該字段的值可能會被多個獨立的線程改變,不要對該字段的訪問進行優(yōu)化。

使用 volatile 可以確保字段的值是可用的最新值,而且該值不會像非 volatile 字段值那樣受到緩存的影響。好的做法是將每個可能被多個線程使用的字段標(biāo)記為 volatile,以防止非預(yù)期的優(yōu)化行為。

為了加深理解,我們來看一個實際的例子:

public class Worker
{
 private bool _shouldStop;

 public void DoWork()
 {
  bool work = false;
  // 注意:這里會被編譯器優(yōu)化為 while(true)
  while (!_shouldStop)
  {
   work = !work; // do sth.
  }
  Console.WriteLine("工作線程:正在終止...");
 }

 public void RequestStop()
 {
  _shouldStop = true;
 }
}

public class Program
{
 public static void Main()
 {
  var worker = new Worker();

  Console.WriteLine("主線程:啟動工作線程...");
  var workerTask = Task.Run(worker.DoWork);

  // 等待 500 毫秒以確保工作線程已在執(zhí)行
  Thread.Sleep(500);

  Console.WriteLine("主線程:請求終止工作線程...");
  worker.RequestStop();

  // 待待工作線程執(zhí)行結(jié)束
  workerTask.Wait();
  //workerThread.Join();

  Console.WriteLine("主線程:工作線程已終止");
 }
}

在這個例子中,while (!_shouldStop) 會被編譯器優(yōu)化為 while(true)。我們可以看一下實際的運行效果來驗證這一點。切換 Release 模式,按 Ctrl + F5 運行程序,運行效果始終如下:

程序運行后,雖然主線程在 500 毫秒后執(zhí)行 RequestStop() 方法修改了 _shouldStop 的值,但工作線程始終都獲取不到 _shouldStop 最新的值,也就永遠(yuǎn)都不會終止 while 循環(huán)。

我們修改一下程序,對 _shouldStop 字段加上 volatile 關(guān)鍵字:

public class Worker
{
 private volatile bool _shouldStop;

 public void DoWork()
 {
  bool work = false;
  // 獲取的是最新的 _shouldStop 值
  while (!_shouldStop)
  {
   work = !work; // do sth.
  }
  Console.WriteLine("工作線程:正在終止...");
 }

 // ...(略)
}

此時在主線程調(diào)用 RequestStop() 方法后,工作線程便立即終止了,運行效果如下圖所示:

這說明加了 volatile 關(guān)鍵字后,程序可以實時讀取到字段的最新值。

注意,一定要切換為 Release 模式運行才能看到 volatile 發(fā)揮的作用,Debug 模式下即使添加了 volatile 關(guān)鍵字,編譯器也是不會執(zhí)行優(yōu)化的。

當(dāng)然,并不是所有的類型都可以使用 volatile 關(guān)鍵字修飾的,常見的使用 volatile 的類型是這些簡單類型:sbyte, byte, short, ushort, int, uint, char, float 和 bool,其它的請查看參考鏈接。

作者:精致碼農(nóng)

出處:http://cnblogs.com/willick

聯(lián)系:liam.wang@live.com

以上就是c# volatile 關(guān)鍵字的拾遺補漏的詳細(xì)內(nèi)容,更多關(guān)于c# volatile 關(guān)鍵字的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# AE之返回上一級和下一級的實戰(zhàn)操作

    C# AE之返回上一級和下一級的實戰(zhàn)操作

    這篇文章主要介紹了C# AE之返回上一級和下一級的實戰(zhàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C# Socket網(wǎng)絡(luò)編程實例

    C# Socket網(wǎng)絡(luò)編程實例

    這篇文章主要介紹了C# Socket網(wǎng)絡(luò)編程實例,分析了Socket網(wǎng)絡(luò)通信的原理與具體應(yīng)用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • C#設(shè)計模式之Builder生成器模式解決帶老婆配置電腦問題實例

    C#設(shè)計模式之Builder生成器模式解決帶老婆配置電腦問題實例

    這篇文章主要介紹了C#設(shè)計模式之Builder生成器模式解決帶老婆配置電腦問題,簡單介紹了生成器模式的概念、功能并結(jié)合具體實例形式分析了C#生成器模式解決配電腦問題的步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • C#代碼實現(xiàn)短信驗證碼接口示例

    C#代碼實現(xiàn)短信驗證碼接口示例

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)短信驗證碼接口示例代碼,感興趣的小伙伴們可以參考一下
    2016-08-08
  • C#使用GDI繪制直線的方法

    C#使用GDI繪制直線的方法

    這篇文章主要介紹了C#使用GDI繪制直線的方法,涉及C#中使用GDI繪圖的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C# ExecuteScalar()方法案例講解

    C# ExecuteScalar()方法案例講解

    這篇文章主要介紹了C# ExecuteScalar()方法案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • c#如何顯式實現(xiàn)接口成員

    c#如何顯式實現(xiàn)接口成員

    這篇文章主要介紹了c#如何顯式實現(xiàn)接口成員,幫助大家更好的利用c#處理接口,感興趣的朋友可以了解下
    2020-10-10
  • C#使用IronPython庫調(diào)用Python腳本

    C#使用IronPython庫調(diào)用Python腳本

    這篇文章介紹了C#使用IronPython庫調(diào)用Python腳本的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C# ManagementObjectSearcher操作window案例詳解

    C# ManagementObjectSearcher操作window案例詳解

    這篇文章主要介紹了C# ManagementObjectSearcher操作window案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C#?多窗口委托通信的實現(xiàn)

    C#?多窗口委托通信的實現(xiàn)

    本文主要介紹了C#?多窗口委托通信的實現(xiàn),窗口之間通信無非有兩個方向,主窗口發(fā)送數(shù)據(jù)到副窗口,副窗口發(fā)送數(shù)據(jù)到主窗口,感興趣的可以了解一下
    2022-03-03

最新評論

永福县| 富锦市| 阿拉尔市| 鄂州市| 白河县| 兴和县| 桐柏县| 长乐市| 西林县| 隆昌县| 石城县| 北辰区| 碌曲县| 平果县| 太仓市| 沙河市| 颍上县| 扬州市| 巴马| 合作市| 宜良县| 永嘉县| 吴堡县| 南部县| 星座| 江油市| 荥阳市| 托里县| 青浦区| 当雄县| 仪征市| 台南市| 炎陵县| 葵青区| 达拉特旗| 石屏县| 图木舒克市| 甘谷县| 文成县| 绥江县| 临夏县|