日期:2014-05-17 浏览次数:21037 次
Quote: 引用: 比如说i从0到5 我用threadPool 调一个函数download(),其实download()结束我是有标志的,(我的理解是,download结束,线程也就结束了)然后在FOR 循环的末尾我会判断是否每个线程的download()结束标志都是TRUE,然后才NEXT, 但这样发现有时候,i=2 时, download()中的某些局部变量的值仍保持着i=1时的值 不知为何 这是多线程编程时一个最容易犯的错误。这说明你的两个线程中的过程共享了相同的变量。通常在编程设计时,你应该为每一个线程复制此变量值得副本,然后传给程序执行。例如for(var i=0;i<5,i++) { ThreadPool.QueueUserWorkItem(h=> { call(i); }); } 这显然就是乱的。因为它们共享了i,会造成重复。你需要修改为for(var i=0;i<5,i++) { var j=i; ThreadPool.QueueUserWorkItem(h=> { call(j); }); }
比如说i从0到5 我用threadPool 调一个函数download(),其实download()结束我是有标志的,(我的理解是,download结束,线程也就结束了)然后在FOR 循环的末尾我会判断是否每个线程的download()结束标志都是TRUE,然后才NEXT, 但这样发现有时候,i=2 时, download()中的某些局部变量的值仍保持着i=1时的值 不知为何
for(var i=0;i<5,i++) { ThreadPool.QueueUserWorkItem(h=> { call(i); }); }
for(var i=0;i<5,i++) { var j=i; ThreadPool.QueueUserWorkItem(h=> { call(j); }); }