为什么代码的结果不是我想要的

hanghangz 2017-11-10 04:56:01
 class ThreadPoolTest2
{
public void Test()
{
int sum = 0;

Action<object> action = obj =>
{
Parm p = (Parm)obj;
sum += p.Num * p.Num;
p.Are.Set();
//Console.WriteLine(p.Num + ":" + p.Num * p.Num);
};

int[] array = new int[] { 1, 2, 3, 4, 5,6,7,8,9,10 };
AutoResetEvent[] autos = new AutoResetEvent[array.Length];
for (int i = 0; i < array.Length; i++)
{
autos[i] = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(a=>action(a), new Parm() { Are = autos[i], Num = array[i] });
}
Console.WriteLine(sum);
//WaitHandle.WaitAll(autos);
autos.ToList().ForEach(s=>s.WaitOne());
Console.WriteLine(sum);
}

class Parm
{
public int Num { set; get; }
public AutoResetEvent Are { set; get; }
}
}



ThreadPoolTest2 threadPoolTest2 = new ThreadPoolTest2();
threadPoolTest2.Test();

Console.ReadKey();


代码如上,使用ThreadPool计算1-10每个数的平方的和.
但是结果是错误的.每次结果还不同.大婶们,解答吧.
...全文
249 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
大然然 2017-11-13
  • 打赏
  • 举报
回复
结帖,给分, 哈哈哈哈啊
hanghangz 2017-11-13
  • 打赏
  • 举报
回复
引用 7 楼 qq_25095899 的回复:
因为你没有lock
一语惊醒梦中人. 大婶,按钮方法,把 sum += p.Num * p.Num; 这句lock了一下,运行了x次,没有其他错误结果出现了.
大然然 2017-11-13
  • 打赏
  • 举报
回复
因为你没有lock
hanghangz 2017-11-13
  • 打赏
  • 举报
回复
引用 4 楼 xiaoruanzhu 的回复:
说错了,应该是循环体内要加个等待时间
加等待时间就没有意义了. 多线程就是要解决并行运算的问题.
hanghangz 2017-11-13
  • 打赏
  • 举报
回复
我是楼主,我补充说明一下. 我问这个问题,不是为了问怎么计算1-10的平方和. 而是想问多线程ThreadPool.QueueUserWorkItem 和 AutoResetEvent 怎么最后同步的问题. 因为代码最后同步是失败了. 代码的原理就是开启十个线程,每个线程计算一个数的平方, 最后在所有线程完成后,在求和. 但是运行结果是求和的时候,没有等到各个线程运行完成就开始计算,导致结果不是385.(多运行几次,90%是385,其余10%是小于385的一个数.)
xiaoruanzhu 2017-11-10
  • 打赏
  • 举报
回复
说错了,应该是循环体内要加个等待时间
xiaoruanzhu 2017-11-10
  • 打赏
  • 举报
回复

autos[i] = new AutoResetEvent(false);
                ThreadPool.QueueUserWorkItem(a=>action(a), new Parm() { Are = autos[i], Num = array[i] });
这两行中间要加个等待时间
白衣如花 2017-11-10
  • 打赏
  • 举报
回复
为什么我执行你的代码结果是正确的啊
bidisty 2017-11-10
  • 打赏
  • 举报
回复
看不懂

 (new int[] { 1, 2, 3, 4, 5,6,7,8,9,10 }).Select(s=>s*s).Sum();
是这个意思吗?

110,538

社区成员

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

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

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