知识大全 详解.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] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 四互斥锁
详解.NET编程过程中的线程冲突[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一什么是线
详解.NET编程中的线程冲突 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一什么是线程冲突
知识大全 .Net Micro Framework线程技术详解
.NetMicroFramework线程技术详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
基于.NET的多线程编程入门 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!多线程在构建大型系统的时
.NET下的多线程编程应用程序域 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一应用程序域&n
详解.NET中的动态编译[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 需要解释的是这里我
详解.NET中的动态编译技术[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 需要解释的是这
浅析Java多线程编程中的高级技术 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb
知识大全 Delphi与SQL Server存储过程编程详解
Delphi与SQLServer存储过程编程详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!