Quando il blocco non è necessario nel multithreading

0

Voglio che 500 oggetti vengano elaborati contemporaneamente utilizzando il multithreading. Questi oggetti avranno alcuni dati iniziali prima della creazione dei thread.

Sto creando 5 thread e ogni thread prende 100 oggetti e avvia l'operazione.

Ecco il codice.

public class InputData
{
   public string initialData {get; set;}
   public string formula {get; set;}
   public string resultData {get; set;}
}

public static List<string> result = new List<string>(500);

public static void Main()
{
    List<InputData> lst = new List<InputData>(500);

    List<InputData> lst_1 = .. // This will hold 1 to 100 objects
    List<InputData> lst_2 = .. // This will hold 101 to 200 objects
    List<InputData> lst_3 = .. // This will hold 201 to 300 objects
    List<InputData> lst_4 = .. // This will hold 301 to 400 objects
    List<InputData> lst_5 = .. // This will hold 401 to 500 objects

    Thread t1 = new Thread(Update);
    ...
    ...
    Thread t5 = new Thread(Update);

    t1.Start(lst_1);
    ...
    t5.Start(lst_5);

    //while condition to wait for the threads to finish processing
    while(...)
    {
        ..
    }
}

public static void Update(List<InputData> lstAll)
{
    lstAll.resultData = lstAll.initalData + lstAll.formula;

    //result.Add(lstAll.resultData); 
}

Come puoi vedere dal codice, ogni thread usa un mucchio di oggetti. E sto aggiornando solo la proprietà resultData di ogni oggetto.

Il blocco è necessario in questo programma? Qualcuno può aiutarti

.net version è 3.5

    
posta khcha22 28.09.2014 - 16:39
fonte

2 risposte

3

Dovrai analizzarlo come sbucciare una cipolla.

La modifica delle proprietà degli oggetti che sono memorizzati in List<> non causerà lo spostamento della posizione dell'indice. Non farà in modo che List<> esegua eventuali riallocazioni.

Pertanto, se List<> non viene modificato (oggetti inseriti, cancellati, spostati o sostituiti), quindi:

(1) hai ragione, usando List<> che è completamente preinizializzato con gli oggetti sarebbe sufficiente.

Ma (2) dovresti guardare al livello successivo: il calcolo di ogni oggetto ha la possibilità di interferire l'uno con l'altro. Dal momento che non possiamo vedere il codice per il calcolo, non possiamo commentare su questo.

Questa analisi è applicabile solo all'implementazione List<> fornita nel framework .NET. Se qualcuno implementa il proprio IList<> , con logica e comportamenti non banali (tali da non imitare affatto i comportamenti dell'implementazione standard, ad esempio modificando autonomamente le posizioni di ordinamento o indice degli oggetti), l'analisi non applicare.

    
risposta data 28.09.2014 - 17:16
fonte
2

Finché tutti i tuoi cinque elenchi sopra contengono insiemi disgiunti di oggetti e finché la linea

  result.Add(lstAll.resultData); 

è commentato, non è necessario il blocco. Ma immagino che non ci stia raccontando tutta la storia, il programma sopra nella forma attuale non ha molto senso, dal momento che ogni risultato viene gettato via dopo l'elaborazione. Quindi dicci come e in quale thread intendi aggregare i risultati, quindi potresti ottenere risposte migliori.

    
risposta data 28.09.2014 - 20:36
fonte

Leggi altre domande sui tag