Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁定参数并将其传递给多线程代码_C#_Multithreading_Locking - Fatal编程技术网

C# 锁定参数并将其传递给多线程代码

C# 锁定参数并将其传递给多线程代码,c#,multithreading,locking,C#,Multithreading,Locking,我想按如下方式使用多线程程序,但当我运行该程序时,R1、R2和R3是不同的 using System; using System.Threading; using System.Threading.Tasks; namespace ParallelFor { class Program { static void Main() { Console.WriteLine("Program started"); do

我想按如下方式使用多线程程序,但当我运行该程序时,R1、R2和R3是不同的

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ParallelFor
{
   class Program
   {
       static void Main()
       {
           Console.WriteLine("Program started");
           double R1 = 0.0;
           double R2 = 0.0;
           double R3 = 0.0;
           var t1 = new Thread(() => TestCounter(1000, ref R1, 1));
           var t2 = new Thread(() => TestCounter(1000, ref R2, 2));
           var t3 = new Thread(() => TestCounter(1000, ref R3, 3));
           t1.Start();
           t2.Start();
           t3.Start();

           do
           {
               Thread.Sleep(1000);
               Console.WriteLine("waiting...");
           } while (t1.IsAlive == true && t2.IsAlive == true &&   t3.IsAlive == true);

           Console.WriteLine("inside R1: {0}", R1);
           Console.WriteLine("inside R2: {0}", R2);
           Console.WriteLine("inside R3: {0}", R3);
           Console.WriteLine("Program finished");
           Console.ReadLine();
       }
       static void TestCounter(int counter, ref double result, int No)
       {
               for (int i = 0; i < counter + 1; i++)
                  for (int j = 0; j < counter; j++)
                      for (int k = 0; k < counter; k++)
                          result += (double)i;
       }
   }
} 
使用系统;
使用系统线程;
使用System.Threading.Tasks;
命名空间并行
{
班级计划
{
静态void Main()
{
Console.WriteLine(“程序已启动”);
双R1=0.0;
双R2=0.0;
双R3=0.0;
var t1=新线程(()=>TestCounter(1000,ref R1,1));
var t2=新线程(()=>TestCounter(1000,ref R2,2));
var t3=新线程(()=>TestCounter(1000,参考R3,3));
t1.Start();
t2.Start();
t3.Start();
做
{
睡眠(1000);
控制台。WriteLine(“等待…”);
}而(t1.IsAlive==true&&t2.IsAlive==true&&t3.IsAlive==true);
WriteLine(“内部R1:{0}”,R1);
WriteLine(“内部R2:{0}”,R2);
WriteLine(“内部R3:{0}”,R3);
Console.WriteLine(“程序完成”);
Console.ReadLine();
}
静态void测试计数器(int计数器,ref-double结果,int-No)
{
对于(int i=0;i
您的
do
循环在第一个线程准备就绪后立即完成

我想你想要

while ( t1.IsAlive || t2.IsAlive || t3.IsAlive );

这将保持
do
循环,直到所有测试都准备就绪。

为什么不简化并使用一个for-loop?还有,如果它们不一样,你会得到什么值?最后一件事-布尔值不需要
==true
。@Mahdy是否应该等待线程加入?如果检查线程是否处于活动状态,则不需要加入线程。@WaiHaLee加入比忙碌等待更可取。应该这样做。@WaiHaLee我会从上到下重新设计整个应用程序,但是是的,这将是朝着正确方向迈出的一步。