1

我试图在我的应用程序中实现多线程,这会进行大量的浮点数计算(神经网络)。

我编写了在该函数之外进行必要计算和更新数组的函数。我实际的单线程代码如下所示(为了更好理解而进行了简化):

class MyClass
{
    // this array after all calculations should contain 
    // result of only one calculation, 
    // that returned smallest value in one of array fields 
    // (smallest neural network error)
    float[] bestResult;

    // runs calculations on all "sets of data"
    public void findBestResult(void)
    {
        foreach (something...) // data rows from database cached in one array
        {
            calculate(x[]);
        }
    }

    // calculates one "set of data"
    public void calculateAndUpdateResultIfBetter(float[] inputData)
    {

        if (bestResult[0] > calculatedData[0])
             bestResult = calculatedData; // update only if condition is true
    }

}

我是低级程序员,我不知道如何使用高级(?).NET 线程技术,使用 Synchronize 等。我知道如何为某事创建一个额外的线程并使用委托更新表单上的一些控件。

我不知道如何使用 2-8 个线程做完全相同的事情并相互竞争。

问题 1 是 - 你能帮我解决这个问题吗?我不知道如何开始。由 Niko Drašković 解决

编辑:问题 2 是 - lock() 方法会锁定我的数组以进行读写吗?

4

1 回答 1

5

您使用该lock语句来防止不同的线程同时运行相同的代码。您需要一个引用来用作锁的标识符。创建一个仅用于锁定的简单对象是很常见的:

float[] bestResult;
object sync = new Object();

然后围绕访问您使用的数组的代码lock

lock (sync) {
  if (bestResult[0] > calculatedData[0]) {
    bestResult = calculatedData;
  }
}

您可能希望每个线程首先计算它可以在它负责的数据中看到的最佳值,然后组合这些最佳值。如果您过于频繁地运行锁定代码,您将使线程相互等待,从而失去很多首先运行单独线程的理由。

于 2012-10-21T23:21:39.343 回答