国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

多線程下C#如何保證線程安全?

2019-11-14 13:37:36
字體:
供稿:網(wǎng)友

  多線程編程相對(duì)于單線程會(huì)出現(xiàn)一個(gè)特有的問題,就是線程安全的問題。所謂的線程安全,就是如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的。 線程安全問題都是由全局變量及靜態(tài)變量引起的。

  為了保證多線程情況下,訪問靜態(tài)變量的安全,可以用鎖機(jī)制來保證,如下所示:

 1         //需要加鎖的靜態(tài)全局變量 2         PRivate static bool _isOK = false; 3         //lock只能鎖定一個(gè)引用類型變量 4         private static object _lock = new object(); 5         static void MLock() 6         { 7             //多線程 8             new System.Threading.Thread(Done).Start(); 9             new System.Threading.Thread(Done).Start();10             Console.ReadLine();11         }12 13         static void Done()14         {15             //lock只能鎖定一個(gè)引用類型變量16             lock (_lock)17             {18                 if (!_isOK)19                 {20                     Console.WriteLine("OK");21                     _isOK = true;22                 }23             }24         } 

  需要注意的是,Lock只能鎖住一個(gè)引用類型的對(duì)象。另外,除了鎖機(jī)制外,高版本的C#中加入了async和await方法來保證線程安全,如下所示:

 1 public static class AsynAndAwait 2  { 3         //step 1  4         private static int count = 0; 5         //用async和await保證多線程下靜態(tài)變量count安全 6         public async static void M1() 7         { 8             //async and await將多個(gè)線程進(jìn)行串行處理 9             //等到await之后的語(yǔ)句執(zhí)行完成后10             //才執(zhí)行本線程的其他語(yǔ)句11             //step 212             await Task.Run(new Action(M2));13             Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);14             //step 615             count++;16             //step 717             Console.WriteLine("M1 Step is {0}", count);18         }19 20         public static void M2()21         {22             Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);23             //step 324             System.Threading.Thread.Sleep(3000);25             //step 426             count++;27             //step 528             Console.WriteLine("M2 Step is {0}", count);29         }30 }

  在時(shí)序圖中我們可以知道,共有兩個(gè)線程進(jìn)行交互,如下圖所示:

  用async和await后,上述代碼的執(zhí)行順序?yàn)橄聢D所示:

 

  若每個(gè)線程中對(duì)全局變量、靜態(tài)變量只有讀操作,而無寫操作,一般來說,這個(gè)全局變量是線程安全的;若有多個(gè)線程同時(shí)對(duì)一個(gè)變量執(zhí)行讀寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东平县| 那曲县| 益阳市| 舟山市| 南京市| 渝中区| 海兴县| 乐至县| 新野县| 娱乐| 湖州市| 开阳县| 宣武区| 桂阳县| 巍山| 潼关县| 弥渡县| 荔浦县| 乌拉特中旗| 古交市| 泸西县| 瑞昌市| 原平市| 江门市| 南京市| 浦城县| 固原市| 福清市| 砀山县| 辽中县| 手游| 弥渡县| 威远县| 杭锦旗| 襄汾县| 马尔康县| 吉林省| 鹰潭市| 偃师市| 白城市| 兴安盟|