首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程更新数组

多线程更新数组
EN

Stack Overflow用户
提问于 2012-10-22 07:15:24
回答 1查看 2.5K关注 0票数 1

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

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

代码语言:javascript
复制
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线程技术,使用同步等。我知道如何创建一个额外的线程,并通过使用委托来更新窗体上的一些控件。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-22 07:21:39

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

代码语言:javascript
复制
float[] bestResult;
object sync = new Object();

然后在访问数组的代码中使用lock

代码语言:javascript
复制
lock (sync) {
  if (bestResult[0] > calculatedData[0]) {
    bestResult = calculatedData;
  }
}

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13003145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档