Mam funkcję, która zwraca pozycję w słowniku, na podstawie klucza (nazwa), a jeśli nie istnieje, zwraca nowo utworzony.Blokowanie słownika w obrębie tego samego wątku
Mam pytanie z "podwójnym zamkiem": SomeFunction blokuje _dictionary, aby sprawdzić istnienie klucza, a następnie wywołuje funkcję, która również blokuje ten sam słownik, wydaje się działać, ale nie jestem pewien jeśli istnieje potencjalny problem z tym podejściem.
public Machine SomeFunction(string name)
{
lock (_dictionary)
{
if (!_dictionary.ContainsKey(name))
return CreateMachine(name);
return _dictionary[name];
}
}
private Machine CreateMachine(string name)
{
MachineSetup ms = new Machine(name);
lock(_dictionary)
{
_ictionary.Add(name, ms);
}
return vm;
}
Myślę, że nie rozumiesz, co robi blokowanie. Locking ** blokuje wszystkie inne wątki przed dostępem do chronionego regionu kodu **. Nie ma nic wspólnego z * bieżącym * wątkiem. Możesz wyjąć blokadę tysiąc razy na ten sam przedmiot na tej samej nitce, bez problemu; każdy region kodu zamknięty w ten sposób będzie chroniony przed dostępem innych wątków. –
Jeśli szukasz "zamków w tym samym wątku", zajrzyj do klasy [Semaphore] (http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx). – ANeves