2017-08-27 128 views
0

我是新来的多线程,我通过我在冲浪时学到的东西做了一个简单的代码。使用c#多线程来计算

   Task[] tasks = new Task[B.Col]; 
       for(int j = 0; j < B.Col; j++) 
       { 
        tasks[j] = Task.Run(() => 
        { 
         for (int k = 0; k < A.Col; k++) 
         { 
          C[i, j] += A[i, k] * B[k, j]; 
         } 
        }); 
       } 
       /* 
       for(int j = 0; j < B.Col; j++) 
       { 
        for(int k = 0; k < A.Col; k++) 
        { 
         C[i, j] += A[i, k] * B[k, j]; 
        } 
       } 
       */ 

我想检查这是否是'多线程'下面的代码的正确方法。如果这段代码效率不高,请你帮我找一个更好的方法吗?

+0

你在哪里定义'i'?我没看到它。 –

+0

@GeorgeAlexandria我在代码之外,代码在另一个循环中。 – user5876164

+0

[何时使用Parallel.ForEach循环而不是常规的foreach?]可能的副本(https://stackoverflow.com/questions/12251874/when-to-use-a-parallel-foreach-loop-instead-of -a-regular-foreach) – mjwills

回答

1

为了让你的工作尝试,你需要一些小的修改

Object thisLock = new Object(); 

int totalThreads = 3; 
Task[] tasks = new Task[totalThreads]; 
for (int j = 0; j < totalThreads; j++) 
{ 
    // We're taking a reference of the value of `j`, 
    // this is because on each iteration, the value of `j` 
    // will change and cause issues in your threads. 
    var jRef = j; 

    tasks[jRef] = Task.Run(() => 
    { 
     for (int k = 0; k < totalThreads; k++) 
     { 
      lock (thisLock) 
      { 
       // Perform operations on shared resources 
      } 
     } 
    }); 
} 

Task.WaitAll(tasks); 

编辑

如果你要投下来的,解释原因。 OP发布了一个他试图正确运行的代码示例。我对他的解决方案进行的编辑演示了他需要做什么来使代码正常工作而不会产生令人讨厌的惊喜,它在控制台应用程序中进行了测试,并且其作品作品

+0

这对我来说似乎有点棘手。为什么你使用jRef而不是j,并且如果必须使行数(行数col)超过总线程数,我应该如何将其实际应用于代码? (=>为什么在for循环之外定义任务) – user5876164

+0

@ user5876164为什么不从小开始,你试图咬的比你可以咀嚼的多。手动指定一定数量的线程,而不是动态设置它。 'j'被设置为'jRef',因为在你的例子中,你在刚刚创建的线程中使用'j'。在每一次迭代中,'j' **的值都会改变**,所以这部分代码'C [i,j] + = A [i,k] * B [k,j];'永远不会是准确的。如果当你开始一个线程时'j' == 1,'j'会在第二次迭代时改变为2的值,并且它会搞乱你所有的计算 –

+0

@ user5876164什么是kja和所有这些其他变量,显示什么他们是因为你要求我解释你的代码而没有向我显示你的代码 –