Все, помилка знайдена)
Причина - банально практики не хватає з мультипоточкою, якби вона була - не допустив би такої помилки
Сама помилка в наступному:
for (int i = 0; i < THREAD_COUNT - 1; i++)
{//проходить роздача параметрів потокам
first = current;
for (long j = 0; j < interval; j++)
current = current.Next;
threads[i] = Task.Run(() =>
{
MakeStepForPopulation_thread(first, interval);
});
}
//останній потік в мене особливий, має починатись так
threads[THREAD_COUNT - 1] = Task.Run(() =>
{
MakeStepForPopulation_thread(current, -1);
});
Не зважаючи на те, що завдання таскам я присвоював поступово, тіло завдань починало виконуватись трохи пізніше, а саме після того, як весь цикл пройде, таким чином first вже був кінцевим, навіть для того потоку, який мав би початись першим. Вирішив це наступним методом:
private int startedThreadCount;
public void MakeStepForPopulation()
{
LinkedListNode<Homosapien> current = population.First;
//LinkedListNode<Homosapien> next;
LinkedListNode<Homosapien> first;
long interval = population.Count / THREAD_COUNT;
startedThreadCount = 0;
for (int i = 0; i < THREAD_COUNT - 1; i++)
{
first = current;
for (long j = 0; j < interval; j++)
current = current.Next;
threads[i] = Task.Run(() =>
{
MakeStepForPopulation_thread(first, interval);
});
//тут чекаємо, поки поток не почнеться, щоб нормально задались параметри
while (startedThreadCount <= i)
System.Threading.Thread.Sleep(1);
}
threads[THREAD_COUNT - 1] = Task.Run(() =>
{
MakeStepForPopulation_thread(current, -1);
});
Task.WaitAll(threads);
}
public void MakeStepForPopulation_thread(LinkedListNode<Homosapien> current, long interval)
{
//відзначається вхід потоку
startedThreadCount++;
//ждем, поки всі потоки не почнуться
while (startedThreadCount != THREAD_COUNT)
System.Threading.Thread.Sleep(10);
LinkedListNode<Homosapien> next;
while (!(interval == 0 || current == null))
{
next = current.Next;
current.Value.MakeStep(
GetMatrixConversion(current.Value.Age.Year,
today.Month));
interval--;
current = next;
}
}