Welcome

首页 / 软件开发 / .NET编程技术 / 线程冲突详解

线程冲突详解2011-08-04 博客园 Ivony...今天被GF问到一个问题,某个函数在多线程环境中,会不会有冲突。在帮她解答这个问题的过程中, 发现很多人对线程冲突和线程安全的理解并不是很全面,所以萌发了写这么一篇文章的想法,也算是对GF 的问题的一个完整的解答。

水平有限,如有错漏指出敬请指出。

一、什么是线程冲突

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

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

伪代码如下:

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

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

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

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

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

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

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