.NET编程中的线程冲突详解

  次阅读 作者:智能小宝 来源:互联网 2016-01-27 15:32 我要评论(0)

一、什么是线程冲突

线程冲突其实就是指,两个或以上的线程同时对同一个共享资源进行操作而造成的问题。

一个比较经典的例子是,用一个全局变量做计数器,然后开N个线程去完成某个任务,每个线程完成一次任务就将计数器加一,直到完成100次任务。如果不考虑线程冲突问题,用类似下面的代码去做,则很可能会超额完成任务,线程越多,完成任务次数超出100次的可能性就越大。

代码如下:

int count = 0;//全局计数器

void ThreadMethod()//运行在每个线程的方法

{

while( true )

{

if ( count >= 100 )//如果达到任务指标

break;//中断线程执行

DoSomething();//完成某个任务

count++;

}

}

// 省略线程的创建等代码

具体的,为什么会超额完成任务的原因在这里我就不赘述了,这个例子在单线程环境中是绝对不会超额完成任务的。

当然,在这个例子中,将count++放到if语句中,也许能降低一些事故发生的概率,但那不是绝对的,换言之这样的程序不能杜绝超额完成任务的可能。

其实从线程冲突的定义中我们不难发现,要造成线程冲突有两个必要条件:多线程和共享资源。这两个条件中有一个不成立,就不可能发生线程冲突问题。

所以,在单线程环境中,是不存在线程冲突的问题的。不过很可惜的是,我们的软件早已进化到了多进程多线程的时代,单线程的程序几乎是不存在的,无论是 WinForm还是WebForm,程序运行的环境都是多线程的,而不论你自己是不是明确的开启了一个线程。

既然多线程是不可避免的,那么要避免线程冲突就只能从共享资源来开刀了。

二、线程安全的资源

如果大家经常看MSDN或者VS帮助中的.NET类库参考的话,就不难发现几乎所有的类型都有这么一句话的描述: 此类型的任何公共 static(在 Visual Basic中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。 那么线程安全到底是什么意思?

其实线程安全很简单,就是指一个函数(方法、属性、字段或者别的)在同一时间被不同线程使用,不会造成任何线程冲突的问题。就说这个东西是线程安全的。

接下来来谈谈什么样的资源是线程安全的。

之所以使用资源这个词,是因为线程冲突不仅仅会发生在共享的变量上,两个线程同时对同一个文件进行读写,两个程序同时用同一个端口与同一个地址进行通信,都会造成线程冲突。只不过是操作系统和帮我们协调了这些冲突而已。

一个线程安全的资源即是指,在不同线程中使用不会导致线程冲突问题的资源。

一个不能被改变的资源是线程安全的,比如说一个常量:

const decimal pai = 3.14159265;//C++: const double pai = 3.14159265;

因为pai的值不可能被改变,所以在不同的线程中使用也不会造成冲突。换言之它在不同的线程中同时被使用和在一个线程中被使用是没有区别的,所以这个东西是线程安全的。

同样的,在.NET中,一个字符串的实例也是线程安全的,因为字符串的实例在.NET中也是不可以被改变的。一个字符串的实例一旦被创建,对其所有的属性、方法调用的结果都是唯一确定的,永远不会改变的。所以.NET类库参考中String类型才有: 此类型是线程安全的。 ,与之类似的Type类型、 Assembly类型,都是线程安全的。

但string的实例是线程安全的,却不代表string的变量是线程安全的,换言之,假设有一个静态变量:

public static string str =123 ;

str不是线程安全的,因为str这个变量的字符串实例可以被任何线程修改。

再考虑这样的例子:

public static readonly SqlConnection connection = new SqlConnection(connectionString);

虽然connection本身虽然是线程安全的,但connection的任何成员都不是线程安全的。

比如说,我在一个线程中对这个 connection调用了Open方法,然后进行查询操作。但在同一时刻,另一个线程调用了Close方法,这时候,就出现错误了。

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...