本文摘自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 ;
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)
{
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
{
private static int count = 0;
public async static void M1()
{
await Task.Run( new Action(M2));
Console.WriteLine( "Current Thread ID is {0}" , System.Threading.Thread.CurrentThread.ManagedThreadId);
count++;
Console.WriteLine( "M1 Step is {0}" , count);
}
public static void M2()
{
Console.WriteLine( "Current Thread ID is {0}" , System.Threading.Thread.CurrentThread.ManagedThreadId);
System.Threading.Thread.Sleep(3000);
count++;
Console.WriteLine( "M2 Step is {0}" , count);
}
}
|
在时序图中我们可以知道,共有两个线程进行交互,如下图所示:
用async和await后,上述代码的执行顺序为下图所示:
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时对一个变量执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全
以上就是分享多线程下C#如何保证线程安全的详细内容!
相关阅读 >>
几个优秀的java和C#代码转换工具
C#中常用的运算符有哪些
C#多线程编程实例-线程与窗体交互的代码分析
详解C#中抽象类与接口的区别
C#中字符串的一般性和特殊性具体介绍(图文)
C#兼容各大浏览器的文件下载实例详解
unity 3d 浅谈shader 运行时状态及渲染模式遇到的问题
采用 C# 编写的学委助手详解及实例
C#使用webclient登录网站并抓取登录后的网页信息实现方法
C#正则函数匹配、替换、提取的用法代码分享
更多相关阅读请进入《C#》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » 分享多线程下C#如何保证线程安全