C# Trådsäkerhet
Hejsan.
Jag sitter och experimenterar med ett program lite grann i C# .NET 4.0.
Nu finns ju intressant stöd för parallell-programmering i .NET. Det finns också trådsäkra alternativ till List och Dictionary med flera.
Min fråga är när det är okej att använda en vanliga lista och när man måste använda en som är säker för exekvering med parallella trådar.
Ta denna kod till exempel:
int[] minArray = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int räknare = 0;
List<int> minLista = new List<int>();
Parallel.Invoke(
() =>
{
for(int i = 0 ; i < 5 ; i++)
{
räknare += minArray[i];
minLista.Add(minArray[i]);
}
},
() =>
{
for(int i = 5 ; i < 10 ; i++)
{
räknare += minArray[i];
minLista.Add(minArray[i]);
}
}
);
Är det okej att på det viset både skriva till enkla typer som int (räknare), lägga till saker till listor (minLista) och läsa från ej-trådsäkra samlingar (minArray)?
Alternativt finns ju ConcurrentBag som jag skulle kunna använda istället för listan, den är ju speciellt framtagen för att användas parallellt.
Jag känner mig osäker på när något förstör för programmet, när något kommer söla ner programmet på grund av synkroniseringar och när något är helt okej att göra.
Vad jag förstått går det i varje fall att ha trådar som läser från en gemensam lista utan att det blir strul, men segar det ned programmet om man inte specificerat att listan är read-only på något vis?
I mitt program har jag också ett stort antal trådar som behandlar data och sedan lägger till resultatet till en lista. Denna lista läses aldrig inifrån trådarna utan de skriver bara till den. Den läses inte förän programmet är tillbaka till att bara exekvera i en tråd, fungerar det att göra så eller bör jag använda ConcurrentBag istället för List?