我试图在我的应用程序中实现多线程,这会进行大量的浮点数计算(神经网络)。
我编写的函数可以在该函数之外进行必要的计算和更新数组。 我的实际单线程代码看起来像这样(为了更好地理解而简化):
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是 - 你可以帮我解决这个问题吗?我不知道如何开始。由NikoDrašković解决
编辑: 问题2是 - 将lock()方法锁定我的数组以进行读写吗?
答案 0 :(得分:5)
您使用lock
语句来防止不同的线程同时运行相同的代码。您需要一个引用作为锁的标识符。创建一个仅用于锁定的简单对象是很常见的:
float[] bestResult;
object sync = new Object();
然后围绕访问数组的代码使用lock
:
lock (sync) {
if (bestResult[0] > calculatedData[0]) {
bestResult = calculatedData;
}
}
您可能希望让每个线程首先计算它在其负责的数据中可以看到的最佳值,然后组合这些最佳值。如果您经常运行锁定的代码,则会使线程彼此等待,从而失去了首先运行单独线程的大部分原因。