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

Posted 函数

篇首语:聪明在于勤奋,天才在于积累。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 详解.NET编程过程中的线程冲突[2]相关的知识,希望对你有一定的参考价值。

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

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

  但 单纯的使用connection而不使用其任何成员 比如说if ( connection != null )这样的代码 是不存在线程冲突的

  线程安全的资源其实还有很多 在此不一一赘述

  对于 NET Framework的类型的成员来说 只读的字段是线程安全的

  那么对于属性和方法来说 怎么知道是不是线程安全的?

  三 线程安全的函数

  因为属性和方法都是函数组成的 所以我们探讨一下什么是线程安全的函数

  上面我们说到 线程冲突的必要条件是多线程和共享资源 那么如果一个函数里面没有使用任何可能共享的资源 那么就不可能出现线程冲突 也就是线程安全的 比如说这样的函数

public static int Add( int a int b )return a + b;

  这个函数中所使用的所有的资源都是自己的局部变量 而函数的局部变量是储存在堆栈上的 每个线程都有自己独立的堆栈 所以局部变量不可能跨线程共享 所以这样的函数显然是线程安全的

  但值得注意的是 下面的函数不是线程安全的

public static void Swap( ref int a ref int b )//C++: void Swap( in& a int& b )int c = a;a = b;b = c;

  因为ref的存在 使得函数的参数是按引用传递进来的 换言之a和b看起来是函数的局部变量 但实际上却是函数外面的东西 如果这两个东西是另一个函数的局部变量 倒也没有问题 如果这两个东西是全局变量(静态成员) 就不能确保没有线程冲突了 而在上个例子中 a和b在传入函数之时 就做了一个拷贝的动作 所以传进来的a b到底是全局变量还是静态成员都没有关系了

  同样 这样的函数也不是线程安全的

public static int Add( INumber a INumber b )//C++: int Add( INumber* a INumber* b );return a Number + b Number;//C++: return a >Number + b >Number;

  原因在于a和b虽然是函数的内部变量没错 但a Number和b Number却不是 它们不存在于堆栈上 而是在托管堆上 可能被其他线程更改

  但只使用局部变量的函数在 NET类库中是很少的 但 NET类库中还是有那么多线程安全的函数 是为什么呢?

  因为 即使一个函数使用了共享资源 如果其所使用的共享资源都是线程安全的 则这个函数也是线程安全的

  比如说这样的函数

private const string connectionString = … ;public string GetConnectionString()return connectionString;

  虽然这个函数使用了一个共享资源connectionString 但因为这个资源是线程安全的 所以这个函数还是线程安全的

  同样的 我们可以得出 如果一个函数只调用线程安全的函数 只使用线程安全的共享资源 那么这个函数也是线程安全的

  这里有一个容易被忽略的问题 运算符 并不是所有的运算符(尤其是重载后的运算符)都是线程安全的

cha138/Article/program/net/201311/15564

相关参考

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

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

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

详解.NET编程过程中的线程冲突[1]  以下文字资料是由(全榜网网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

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

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

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

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

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

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

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

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