2010-05-06 14 views
14

Chciałbym wiedzieć, czy istnieją jakieś wytyczne, które deweloper powinien śledzić, kiedy (i gdzie) umieścić zamki.Wytyczne, kiedy należy korzystać z blokowania

Na przykład: Rozumiem, że kod taki jak ten powinien być zablokowany, aby uniknąć możliwości kolejnego wątku zmieniającego wartość SomeHeapValue nieoczekiwanie.

class Foo 
{ 
    public SomeHeapObject myObject; 
    public void DoSummat(object inputValue_) 
    { 
    myObject.SomeHeapValue = inputValue_; 
    } 

} 

Moje pytanie brzmi jednak, jak głęboko pasuje do zamka? Na przykład, jeśli mamy ten kod:

class Foo 
{ 
    public SomeHeapObject myObject; 
    public void DoSummat(object inputValue_) 
    { 
    myObject.SomeHeapValue = GetSomeHeapValue(); 
    } 

} 

powinniśmy zablokować w (...) sposobu DoSummat, czy powinniśmy zablokować w metodzie GetSomeHeapValue()?

Czy istnieją jakieś wytyczne, o których należy pamiętać podczas rysowania wielowątkowego kodu?

Odpowiedz

21

najlepszym przewodnikiem do blokowania i gwintowania znalazłem, jest to strona (jest to tekst skonsultować podczas pracy z blokadą i gwintowania):

http://www.albahari.com/threading/

Yo chce paragraf „Blokowanie i Bezpieczeństwo wątków ", ale przeczytaj też resztę, jest bardzo dobrze napisana.

+1

dzięki które są przydatne ... ale dlaczego wszystkie przykłady używać statycznych zmiennych składowych? są też problemy z bezpieczeństwem wątków w zmiennych należących do klasy, prawda? – miguel

+0

@miguel: możliwe jest zablokowanie członka instancji za pomocą "blokady (tej)", wyjaśnienia i przykładu 2 na tej stronie zawierają więcej szczegółów: http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS. 71% 29.aspx. Myślę, że na stronie Albahari używa on statycznego, ponieważ wtedy nie musi wykonywać instancji klasy, co sprawia, że ​​jego przykłady są krótsze. – user218447

+0

@miguel: obiekt blokady musi być współdzielony przez wątki, aby był użyteczny, a statyczny to czysty i łatwy sposób na to. Statyczny nie jest z natury zły, po prostu nadużyty, tak jak w starych globach. –

2
  • Zablokuj tak mało, jak to możliwe, ale tyle, ile potrzeba.

  • Unikaj blokad, gdy to możliwe - w .NET 4.0 istnieją alternatywy, które nie powodują przełączenia kontekstu.

  • Staraj się nie blokować wiele razy. Zbuduj odpowiednio interfejs API. Na przykład kolejka. DeQueue - utwórz alternatywny DeQueue (wartość int), który może anulować wiele pozycji za pomocą jednego zamka.

-1

Jak o przekazywanie komunikatów zamiast blokowania, debugowanie kodu blokującego trudno

Powiązane problemy