Ho difficoltà a capire perché il multithreading non riesce ad aggiornare i valori prima del completamento del thread. Il thread separato ha una propria copia dei riferimenti o dei valori?
Problema di multithreading che aggiorna il valore
In caso contrario, la mia comprensione il codice qui sotto dovrebbe funzionare correttamente quando MyMethod viene chiamato, ma spesso non creare istanze di alcuni oggetti MyType nella matrice prima della thread.IsAlive
diventa falso:
class MyClass
{
static MyType[] obj = new MyType[Environment.ProcessorCount - 1];
void MyMethod()
{
Thread[] threads = new Thread[Environment.ProcessorCount - 1];
for (int i = 0; i < Environment.ProcessorCount - 1; i++)
{
threads[i] = new Thread(() => FillObjects(i));
threads[i].Priority = ThreadPriority.AboveNormal;
threads[i].Start();
}
while (threads[i].Any(c => c.IsAlive))
{
Thread.Sleep(50);
}
}
void FillObjects(int i)
{
obj[i] = new MyType();
//perform actions with obj[i] to fill it with necessary values
}
}
Buon punto. Se la prima istruzione in 'FillObjects()' fosse un 'Thread.Sleep (1000)' probabilmente solo 'obj [Environment.ProcessorCount - 1]' non sarebbe nullo perché il ciclo avrebbe incrementato 'i' al suo valore finale prima che venga creato il primo oggetto. Pensandoci, FillObjects() può essere lanciato perché 'i' effettivamente viene incrementato in' Environment.ProcessorCount-1' prima che il ciclo esca ed è quindi fuori dai limiti di 'obj'. –
Grazie per la risposta, in effetti quello era uno dei maggiori problemi, ora crea un'istanza degli oggetti correttamente. Tuttavia il thread non completa tutte le operazioni correttamente prima che si chiuda e lo fa a caso. Eventuali suggerimenti? – Almis
Ho trovato il mio errore logico, ora funziona correttamente. – Almis