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

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每个数的平方的和.
但是结果是错误的.每次结果还不同.大婶们,解答吧.
...全文
384 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();
是这个意思吗?
内容概要:本文围绕“基于分布式模型预测控制的多个固定翼无人机一致性控制”展开,利用Matlab代码实现相关算法的仿真,旨在通过分布式控制策略实现多架固定翼无人机在复杂动态环境中的协同飞行与一致性控制。研究结合模型预测控制(MPC)方法,构建适用于多无人机系统的分布式优化框架,重点解决了通信受限、信息延迟及无中心化指挥条件下的协同稳定性问题。内容涵盖固定翼无人机的动力学建模、分布式MPC优化求解机制、一致性协议设计、通信拓扑结构分析以及仿真验证全过程,确保多机系统在保持队形一致的同时完成协同任务。; 适合人群:具备自动控制理论、无人机系统建模或多智能体协同控制基础,从事智能无人系统、集群控制、自动化与机器人等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多无人机协同编队飞行、集群侦察、分布式任务执行等实际工程场景;②为分布式MPC算法在多智能体系统中的一致性控制提供可复现的Matlab仿真案例,推动先进控制理论向工程实践转化;③服务于科研论文复现、算法验证、控制系统课程设计与毕业课题参考。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块运行与调试,重点关注分布式MPC在不同通信拓扑下对一致性收敛性能的影响,并可通过调整预测时域、权重矩阵与噪声参数等方式深化对算法鲁棒性与适应性的理解。

111,129

社区成员

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

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

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