>

必发88手机版二10四线程下C,如何确认保障线程安

- 编辑:www.bifa688.com -

必发88手机版二10四线程下C,如何确认保障线程安

多线程编制程序相对于单线程会油然则生二个有意识的主题材料,正是线程安全的标题。所谓的线程安全,正是借使您的代码所在的进度中有八个线程在同时运转,而那几个线程或许会同时运行这段代码。要是老是运转结果和单线程运转的结果是毫发不爽的,而且别的的变量的值也和预期的是千篇壹律的。 线程安全主题材料都是由全局变量及静态变量引起的。

四线程下C#什么保险线程安全?,

四线程编制程序相对于单线程会产出1个蓄意的标题,便是线程安全的难点。所谓的线程安全,正是只要你的代码所在的长河中有多个线程在同时运维,而这一个线程只怕会同时运维这段代码。倘诺每便运维结果和单线程运行的结果是同样的,而且其余的变量的值也和预期的是一律的。 线程安全难题都以由全局变量及静态变量引起的。

  为了保障四线程意况下,访问静态变量的崇左,能够用锁机制来担保,如下所示:

必发88手机版 1

 1         //需要加锁的静态全局变量
 2         private static bool _isOK = false;
 3         //lock只能锁定一个引用类型变量
 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只能锁定一个引用类型变量
16             lock (_lock)
17             {
18                 if (!_isOK)
19                 {
20                     Console.WriteLine("OK");
21                     _isOK = true;
22                 }
23             }
24         } 

必发88手机版 2

  需求专注的是,Lock只可以锁住三个引用类型的指标。其它,除了锁机制外,高版本的C#中投入了async和await方法来保管线程安全,如下所示:

必发88手机版 3

 1 public static class AsynAndAwait
 2  {
 3         //step 1 
 4         private static int count = 0;
 5         //用async和await保证多线程下静态变量count安全
 6         public async static void M1()
 7         {
 8             //async and await将多个线程进行串行处理
 9             //等到await之后的语句执行完成后
10             //才执行本线程的其他语句
11             //step 2
12             await Task.Run(new Action(M2));
13             Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
14             //step 6
15             count  ;
16             //step 7
17             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 3
24             System.Threading.Thread.Sleep(3000);
25             //step 4
26             count  ;
27             //step 5
28             Console.WriteLine("M2 Step is {0}", count);
29         }
30 }

必发88手机版 4

  在时序图中我们得以明白,共有几个线程举行互相,如下图所示:

必发88手机版 5

  用async和await后,上述代码的实行各类为下图所示:

 

必发88手机版 6

  若每一个线程中对全局变量、静态变量唯有读操作,而无写操作,一般的话,这一个全局变量是线程安全的;若有多少个线程同时对三个变量实行读写操作,一般都亟待思索线程同步,不然就或然影响线程安全。

水平有限,望各位园友不吝赐教!假使以为不错,请点击推荐和关爱!
出处:
扬言:本文版权归作者和腾讯网共有,应接转发,但未经笔者同意必须保留此段注明,且在文章页面显明地点给出原来的小说连接,不然保留追究法律义务的职分。

二十多线程编制程序相对于单线程会冒出二个有意的标题,正是线程安全的难题。所谓的线程安全,就是借使您的代...

  为了保证二拾102线程景况下,访问静态变量的平安,能够用锁机制来确认保证,如下所示:

必发88手机版 7

 1         //需要加锁的静态全局变量
 2         private static bool _isOK = false;
 3         //lock只能锁定一个引用类型变量
 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只能锁定一个引用类型变量
16             lock (_lock)
17             {
18                 if (!_isOK)
19                 {
20                     Console.WriteLine("OK");
21                     _isOK = true;
22                 }
23             }
24         } 

必发88手机版 8

  须要留意的是,Lock只好锁住3个引用类型的靶子。此外,除了锁机制外,高版本的C#中进入了async和await方法来确认保证线程安全,如下所示:

必发88手机版 9

 1 public static class AsynAndAwait
 2  {
 3         //step 1 
 4         private static int count = 0;
 5         //用async和await保证多线程下静态变量count安全
 6         public async static void M1()
 7         {
 8             //async and await将多个线程进行串行处理
 9             //等到await之后的语句执行完成后
10             //才执行本线程的其他语句
11             //step 2
12             await Task.Run(new Action(M2));
13             Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
14             //step 6
15             count  ;
16             //step 7
17             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 3
24             System.Threading.Thread.Sleep(3000);
25             //step 4
26             count  ;
27             //step 5
28             Console.WriteLine("M2 Step is {0}", count);
29         }
30 }

必发88手机版 10

  在时序图中大家能够知晓,共有三个线程进行交互,如下图所示:

必发88手机版 11

  用async和await后,上述代码的推行顺序为下图所示:

 

必发88手机版 12

  若各样线程中对全局变量、静态变量唯有读操作,而无写操作,一般的话,那个全局变量是线程安全的;若有多少个线程同时对二个变量实行读写操作,一般都亟需思虑线程同步,不然就只怕影响线程安全。

水平有限,望各位园友不吝赐教!要是感到不错,请点击推荐和关切!
出处:
声称:本文版权归小编和天涯论坛共有,迎接转发,但未经小编同意必须保留此段表明,且在篇章页面明显地点给出原作连接,不然保留追究法律权利的义务。

本文由必发88手机版发布,转载请注明来源:必发88手机版二10四线程下C,如何确认保障线程安