知识大全 详解.NET编程过程中的线程冲突[1]

Posted 冲突

篇首语:知识的奇特就在于:谁真心渴求它,谁就往往能够得到它。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 详解.NET编程过程中的线程冲突[1]相关的知识,希望对你有一定的参考价值。

详解.NET编程过程中的线程冲突[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一 什么是线程冲突

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

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

  伪代码如下

int count = ;//全局计数器void ThreadMethod()//运行在每个线程的方法while( true )if ( count >= )//如果达到任务指标break;//中断线程执行DoSomething();//完成某个任务count++;//省略线程的创建等代码

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

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

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

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

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

  二 线程安全的资源

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

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

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

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

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

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

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

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

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

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

public static string str = ;

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

  再考虑这样的例子

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

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

cha138/Article/program/net/201311/15566

相关参考

知识大全 详解.NET编程过程中的线程冲突[3]

详解.NET编程过程中的线程冲突[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  四互斥锁 

知识大全 详解.NET编程过程中的线程冲突[2]

详解.NET编程过程中的线程冲突[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  比如说我在

知识大全 详解.NET编程中的线程冲突

详解.NET编程中的线程冲突  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一什么是线程冲突  

知识大全 .Net Micro Framework线程技术详解

.NetMicroFramework线程技术详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 基于.NET的多线程编程入门

基于.NET的多线程编程入门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!多线程在构建大型系统的时

知识大全 .NET下的多线程编程应用程序域

.NET下的多线程编程应用程序域  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一应用程序域&n

知识大全 浅析Java多线程编程中的高级技术

浅析Java多线程编程中的高级技术  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 详解.NET中的动态编译[1]

详解.NET中的动态编译[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  代码的动态编译并执

知识大全 详解.NET中的动态编译技术[1]

详解.NET中的动态编译技术[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  代码的动态编译

知识大全 Delphi与SQL Server存储过程编程详解

Delphi与SQLServer存储过程编程详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!