C# 多线程程序如何不会重复获取公共资源

wanmm21cn 2012-08-02 10:54:16
我有一个List用于存放一批公共资源,程序生成n个线程来对数据进行处理,每个进程都会到List中获取一个值然后计算,当一个进程计算结束后他会再到List中取值。如何才能保证不会因有两个进程同时到List中取值而读取到同一个值?
...全文
249 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
stonespace 2012-08-03
  • 打赏
  • 举报
回复
你也可以用Monitor.TryEnter 方法来锁定共享对象,比如你的List,确保一个时间只有一个线程能对List进行操作,这个Monitor相当于是临界区的同步对象,而lock本身就是用Monitor类实现的,
stonespace 2012-08-03
  • 打赏
  • 举报
回复
当然可以加锁,而且很容易,用lock关键字:

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

//处理rObj;
...

[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

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


但是如果两个进程同时来读取呢?第一个进程读了,还没remove就被第二个进程读了呢?这不是和数据库脏数据一样么,能像数据库那样加锁吗?
[/Quote]
iyomumx 2012-08-03
  • 打赏
  • 举报
回复
4.0就简单多了。用PLINQ就可以。
list.WithDegreeOfParallelism(n).ForAll(x =>
{
//要执行的内容
});

不是4.0的话,可以另外new object用作同步对象,访问list时加锁,取得值后解锁即可
cnwhm2012 2012-08-03
  • 打赏
  • 举报
回复
定义一个互斥变量Mutex 然后lock它再执行你需要的操作
wanmm21cn 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

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

然后,你可以试试.net 4.0的并行计算新特性 Parallel.For()和 Parallel.ForEach()
可以简洁明了的解决你的问题。
[/Quote]
是多线程,平时进程说的多,说乱了。
谢谢,我查查你说的这两个新东东去
bwangel 2012-08-02
  • 打赏
  • 举报
回复
首先要分清楚“线程"和”进程“是两个差别很大的概念。

然后,你可以试试.net 4.0的并行计算新特性 Parallel.For()和 Parallel.ForEach()
可以简洁明了的解决你的问题。
wanmm21cn 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

取过数据后就remove掉List中刚刚取过的那个值
[/Quote]

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

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧