日期:2014-05-18  浏览次数:20968 次

C# 多线程程序如何不会重复获取公共资源
我有一个List用于存放一批公共资源,程序生成n个线程来对数据进行处理,每个进程都会到List中获取一个值然后计算,当一个进程计算结束后他会再到List中取值。如何才能保证不会因有两个进程同时到List中取值而读取到同一个值?

------解决方案--------------------
首先要分清楚“线程"和”进程“是两个差别很大的概念。

然后,你可以试试.net 4.0的并行计算新特性 Parallel.For()和 Parallel.ForEach()
可以简洁明了的解决你的问题。
------解决方案--------------------
4.0就简单多了。用PLINQ就可以。
list.WithDegreeOfParallelism(n).ForAll(x => 
{
//要执行的内容
});

不是4.0的话,可以另外new object用作同步对象,访问list时加锁,取得值后解锁即可
------解决方案--------------------
当然可以加锁,而且很容易,用lock关键字:

T rObj;
lock(list)
{
rObj=list.First;
list.RemoveFirst();
}

//处理rObj;
...

探讨

引用:

取过数据后就remove掉List中刚刚取过的那个值


但是如果两个进程同时来读取呢?第一个进程读了,还没remove就被第二个进程读了呢?这不是和数据库脏数据一样么,能像数据库那样加锁吗?

------解决方案--------------------
你也可以用Monitor.TryEnter 方法来锁定共享对象,比如你的List,确保一个时间只有一个线程能对List进行操作,这个Monitor相当于是临界区的同步对象,而lock本身就是用Monitor类实现的,