分享多线程下C#如何保证线程安全


本文摘自PHP中文网,作者Y2J,侵删。

多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题。所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。 线程安全问题都是由全局变量及静态变量引起的。

  为了保证多线程情况下,访问静态变量的安全,可以用锁机制来保证,如下所示:

//需要加锁的静态全局变量

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

private static bool _isOK = false;

       //lock只能锁定一个引用类型变量

       private static object _lock = new object();

       static void MLock()

       {

           //多线程

           new System.Threading.Thread(Done).Start();

           new System.Threading.Thread(Done).Start();

           Console.ReadLine();

       }

       static void Done()

       {

           //lock只能锁定一个引用类型变量

           lock (_lock)

           {

               if (!_isOK)

               {

                   Console.WriteLine("OK");

                   _isOK = true;

               }

           }

       }

需要注意的是,Lock只能锁住一个引用类型的对象。另外,除了锁机制外,高版本的C#中加入了async和await方法来保证线程安全,如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

public static class AsynAndAwait

{

        //step 1

        private static int count = 0;

        //用async和await保证多线程下静态变量count安全

        public async static void M1()

        {

            //async and await将多个线程进行串行处理

            //等到await之后的语句执行完成后

            //才执行本线程的其他语句

            //step 2

            await Task.Run(new Action(M2));

            Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);

            //step 6

            count++;

            //step 7

            Console.WriteLine("M1 Step is {0}", count);

        }

        public static void M2()

        {

            Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);

            //step 3

            System.Threading.Thread.Sleep(3000);

            //step 4

            count++;

            //step 5

            Console.WriteLine("M2 Step is {0}", count);

        }

}

在时序图中我们可以知道,共有两个线程进行交互,如下图所示:

173650skktq2s6k9i01kmu.jpg

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

173651j0z8c0qaqqppbav8.png

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时对一个变量执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全

以上就是分享多线程下C#如何保证线程安全的详细内容!

相关阅读 >>

几个优秀的java和C#代码转换工具

C#中常用的运算符有哪些

C#多线程编程实例-线程与窗体交互的代码分析

详解C#中抽象类与接口的区别

C#中字符串的一般性和特殊性具体介绍(图文)

C#兼容各大浏览器的文件下载实例详解

unity 3d 浅谈shader 运行时状态及渲染模式遇到的问题

采用 C# 编写的学委助手详解及实例

C#使用webclient登录网站并抓取登录后的网页信息实现方法

C#正则函数匹配、替换、提取的用法代码分享

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...