gpt4 book ai didi

c# - 线程修改意外变量

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:09 24 4
gpt4 key购买 nike

<分区>

我是 C# 线程的新手,因此对于这个新手错误提前表示歉意。以下代码的目的是评估存储在名为 members 的数组中的种群的适应性。过程 members.calculateFitness() 是一个黑盒子(即我无法修改它以提高性能),所以我试图设置同时调用黑盒子的线程,每个线程将处理 1/THREAD_COUNT 人口成员(所以如果 THREAD_COUNT=4,每个线程将处理 1/4 的人口)。

在第一个 for 循环中,我初始化了每个线程。在第二个 for 循环中,我启动线程。

public void ThreadedPrintPopFitness ()
{
int THREAD_COUNT = 1;
int membersPerThread = members.Length / THREAD_COUNT;

Thread[] fitnessCalculator = new Thread[THREAD_COUNT];
int[] threadResult = new int[THREAD_COUNT];

for (int i = 0; i < THREAD_COUNT; i++) {
int start = i * membersPerThread;
int stop = (i+1) * membersPerThread;
fitnessCalculator [i] = new Thread (() => getMaxFitness (members, start, stop, ref threadResult [i]));
}

for (int i = 0; i < THREAD_COUNT; i++) {
fitnessCalculator [i].Start ();
}

for (int i = 0; i < THREAD_COUNT; i++) {
fitnessCalculator [i].Join ();
}

int maxFitness = 0;
for (int i = 0; i < THREAD_COUNT; i++) {
if (maxFitness < threadResult [i])
maxFitness = threadResult [i];
}

Console.WriteLine ("(ThreadedCount) Fittest Population Member's Fitness: " + maxFitness);
}

private static void getMaxFitness (PopulationMember[] members, int start, int stop, ref int result)
{
int maxFitness = 0;

for (int i = start; i < stop && i < members.Length; i++) {
if (members [i].calculateFitness () > maxFitness) {
maxFitness = members [i].lastFitness;
}
}

result = maxFitness;
}

单步执行代码表明它进入了第二个 for 循环,然后跳回到第一个 for 循环并对整数 i 声明了一个 IndexOutOfBoundsException。我可以看到 i = THREAD_COUNT(我尝试过使用不同的 THREAD_COUNT 数字)。

我完全困惑了,我做错了什么?提前致谢!

enter image description here

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com