Ну ладно, про той випадок забули, зараз наступне:
public void MakeStepForPopulation()
{
LinkedListNode<Homosapien> current = population.First;//мій список
LinkedListNode<Homosapien> first;
long interval = population.Count / THREAD_COUNT;
go = false;//кажу, щоб жоден поток не почав свою роботу
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);
});
//даю добро потокам
go = true;
//чекаю потоки
Task.WaitAll(threads);
}
//власне, що роблять потоки
public void MakeStepForPopulation_thread(LinkedListNode<Homosapien> current, long interval)
{//тут потоки чекають
while (!go)
System.Threading.Thread.Sleep(10);
LinkedListNode<Homosapien> next;
//тут іде обробка списку
while (!(interval == 0 || current == null))
{
next = current.Next;
//MakeStep описаний повідомленням вище. Там є кілька особливих операцій, які змінюють головний список.
current.Value.MakeStep(
GetMatrixConversion(current.Value.Age.Year,
today.Month));
//відраховується лічильник
interval--;
current = next;
}
}
Тут є список елементів, я хочу розбити цей список на THREAD_COUNT, та пустити частини у обробку.
Наприклад, є список 1 2 3 4 5 6 7 8, THREAD_COUNT = 4, інтервал стане рівний 2 (по 2 елементи на поток), і мало б у перший поток на вхід податись (1, 2), на другий (3, 2), на третій (5, 2), і на останній (7, -1) (зроблено для того, щоб останній поток проходив не кокретну кількість елементів, а просто йшов до кінця, на це є певні причини).
Також я хочу, щоб всі потоки почали роботу після "роздачі завдань", тобто передачі параметрів (для уникнення стану гонки). Якщо тут є кращий спосіб - кажіть
Так от, в чому проблема. Проблема в тому, що по факту 3 потоки почались із 5 (а мали із 1 3 5), і один із 7. Тобто - перші три потоки брали параметри в циклі, де
threads[i] = Task.Run(() =>
{
MakeStepForPopulation_thread(first, interval);
});
ну і останній брався окремо, то й получив все правильно. змінна first вийшла для всіх однаковою, ось в цьому проблема. В момент роздачі параметрів вона була різною. Чому так і як від цього позбутись?