C# 多线程更新数组

C# 多线程更新数组,c#,multithreading,.net-3.5,C#,Multithreading,.net 3.5,我正在尝试在我的应用程序中实现多线程,它会进行大量的浮点数计算(神经网络) 我编写了一个函数,在该函数之外进行必要的计算和更新数组。 我的实际单线程代码如下所示(为了更好地理解而简化): 我是低级程序员,我不知道如何使用高级(?.NET线程技术,使用同步等。我知道如何为某些东西创建一个附加线程,并通过使用委托更新窗体上的某些控件 我不知道如何使用2-8个线程做完全相同的事情并相互竞争 问题1是-你能帮我吗?我不知道怎么开始。由Niko Drašković解决 编辑: 问题2是-lock()方法会

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

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

我是低级程序员,我不知道如何使用高级(?.NET线程技术,使用同步等。我知道如何为某些东西创建一个附加线程,并通过使用委托更新窗体上的某些控件

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

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

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

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

float[] bestResult;
object sync = new Object();
然后围绕访问您使用的数组的代码
lock

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

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

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

float[] bestResult;
object sync = new Object();
然后围绕访问您使用的数组的代码
lock

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

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

您看到了吗?不,我没有看到。这似乎是我的答案,但我需要更多的提示。我补充一个问题。你看到了吗?不,我没有。这似乎是我的答案,但我需要更多的提示。我添加了另外一个问题。代码中的Hmmm bestResult不在同步对象内。这是对的吗?@卡米尔:是的。对象引用仅用作标识符,以便所有线程使用相同的监视器进行锁定。
lock
只能防止线程同时进入同一代码块,它不能保护您在
lock
语句中使用的变量中的数据。我应该把锁放在哪里?在我的计算线程?还是在主要的某个地方?现在,当您写关于锁定代码块以由多个线程运行时,我不知道。。。当我把它放在线程方法中时,它将不是同一个代码块?我以为它会锁定变量,但当你写关于锁定代码块。。。我不知道它现在是如何工作的。@Kamil:当您有多个线程在运行时,您需要在访问这些线程中变量的每个代码块周围设置锁。
lock
语句的语法很容易让您相信它可以保护变量不被其他地方访问,但它不是这样工作的。引用仅用作锁的标识符,不管引用指向什么,但它必须保留其值。如果将
bestResult
变量用作锁标识符,则在更改引用时锁将不起作用。代码bestResult中的Hmmm不在同步对象内。这是对的吗?@卡米尔:是的。对象引用仅用作标识符,以便所有线程使用相同的监视器进行锁定。
lock
只能防止线程同时进入同一代码块,它不能保护您在
lock
语句中使用的变量中的数据。我应该把锁放在哪里?在我的计算线程?还是在主要的某个地方?现在,当您写关于锁定代码块以由多个线程运行时,我不知道。。。当我把它放在线程方法中时,它将不是同一个代码块?我以为它会锁定变量,但当你写关于锁定代码块。。。我不知道它现在是如何工作的。@Kamil:当您有多个线程在运行时,您需要在访问这些线程中变量的每个代码块周围设置锁。
lock
语句的语法很容易让您相信它可以保护变量不被其他地方访问,但它不是这样工作的。引用仅用作锁的标识符,不管引用指向什么,但它必须保留其值。如果将
bestResult
变量用作锁标识符,则在更改引用时锁将不起作用。