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