Se ho qualcosa di simile (pseudocodice):C# Lista multithread operazioni
class A
{
List<SomeClass> list;
private void clearList()
{
list = new List<SomeClass>();
}
private void addElement()
{
list.Add(new SomeClass(...));
}
}
è possibile che io incorrere in problemi di multithreading (o qualsiasi tipo di comportamento imprevisto) quando entrambe le funzioni vengono eseguite in parallelo?
Il caso d'uso è un elenco di errori che possono essere cancellati in qualsiasi momento (semplicemente assegnando una nuova lista vuota).
EDIT: mie ipotesi sono
- solo thread aggiunge elementi
- elementi dimenticati sono a posto (cioè condizione di competizione tra compensazione e l'aggiunta di un nuovo elemento), a condizione che l'operazione di cancellazione riesce senza problemi
- .NET 2,0
Solo un thread aggiunge elementi, quindi il secondo punto non è un problema per me. E io ero a conoscenza delle condizioni della gara, ma per me non è molto importante - ma non sto affatto definendo "Clear", invece sto creando una nuova lista. Sarebbe un problema chiamare 'Clear' e' Add' nello stesso momento (hai detto che 'List' non è thread-safe)? – AndiDog
Mi spiace, intendevo AddElement e ClearList. La semplice creazione di una nuova lista dovrebbe essere a posto, e se stai aggiungendo solo da un singolo thread dovrebbe andare tutto bene. Non dimenticare che ci possono essere ulteriori complicazioni quando stai leggendo anche dalla lista - succederebbe solo nella stessa discussione che sta facendo l'Add? –
No, un altro thread GUI dovrebbe essere in grado di scorrere su di esso. Questo sarà implementato in poche settimane. Questo può causare problemi se la GUI usa 'foreach (Element e in instanceOfC.list) {...}' - se assegno un nuovo 'List' durante questa iterazione, la GUI funzionerà ancora sulla vecchia lista, giusto? – AndiDog