2012-03-20 15 views
5

Załóżmy, że mam klasę statyczną z metodą statyczną.Stan wyścigu z klasą statyczną?

Wiele wątków może jednocześnie wywoływać tę metodę statyczną.

Czy istnieje potencjał do wyścigu w tych okolicznościach:

a - if the method depends only on local variables 
b - if the method depends on local variables and member fields 
+0

Edytuj pytanie, aby podać pseudo kod lub próbki, aby podać więcej informacji. Dzięki. – Gray

+0

Nic z tego nie ma żadnego skutku w ten czy inny sposób. Liczy się tylko to, czy wiele wątków używa tego samego obiektu. –

+0

Każde wywołanie metody ma własną kopię zmiennych lokalnych, więc mam 99% pewności, że użycie zmiennych lokalnych nie spowoduje wygenerowania warunku wyścigu. Używanie pól elementów będzie jednak. – aboveyou00

Odpowiedz

21

Załóżmy, że mam klasę statyczną ze statyczną metodą. Wiele wątków może jednocześnie wywoływać tę metodę statyczną.

OK.

Czy istnieje potencjał do wyścigu w tych okolicznościach: a - jeśli metoda zależy tylko od zmiennych lokalnych

Tak, istnieją potencjalne warunki wyścigu.

b - jeśli metoda zależy od zmiennych lokalnych i pól członkowskich

Tak, istnieją potencjalne warunki wyścigu.

Odpowiedzi na (a) i (b) są konsekwencją bardziej ogólną zasadę, a mianowicie jest zawsze potencjał warunkach wyścigowych dowolnym czasu nazywamy dowolny metoda z wielu wątków.Na przykład, program ten zakleszczenia:

class MyClass 
{ 
    static MyClass() 
    { 
    // Let's run the initialization on another thread! 
    var thread = new System.Threading.Thread(Initialize); 
    thread.Start(); 
    thread.Join(); 
    } 

    static void Initialize() 
    { } 

    static void Main() 
    { } 
} 

Nie ma pola dwie metody, które robią absolutnie nic, a pojedyncza zmienna lokalna, która jest dostępna tylko w jednym wątku. A jednak natychmiast i konsekwentnie zakleszcza. (Czy wiesz, dlaczego? Zobacz http://ericlippert.com/2013/01/31/the-no-lock-deadlock/, aby uzyskać więcej informacji na temat tego programu.)

Wygląda na to, że szukasz gwarancji, że twój program będzie bezpieczny dla wątków, jeśli statyczne metody nie będą miały dostępu do pól. Nie ma takiej gwarancji. Twój program jest chroniony wątkami tylko wtedy, gdy zapiszesz go jako bezpieczny dla wątków.

+0

Czy coś się zmienia, gdy: 'Initialize' jest niestatyczna i' Thread (new MyClass(). Initialize) '? Lub 'Delegat wątku ((MethodInvoker) {new MyClass(). Initialize();})'? –

+0

Nie jestem do końca pewien, czy ten przykład pasuje do ramki problemu OP. Miałem wrażenie, że odnosi się do metody statycznej, która jest jawnie wywoływana przez wiele zewnętrznych wątków. – Tudor

+1

@BenVoigt: Dziwnie, nie. Środowisko wykonawcze sprawdza, czy statyczny ctor jest uruchamiany po wywołaniu metody Initialize, niezależnie od tego, czy jest to metoda statyczna, czy instancja. Teraz możesz powiedzieć, ale metoda Initialize instancji nie może zostać wywołana, chyba że jest już zbudowana instancja, w którym to przypadku wątek, który konstruktor nazwał konstruktorem statycznym. Ale (1) jak widzieliśmy, konstruktor statyczny może jeszcze nie zostać wykonany i (2) co, jeśli "to" jest zerowe? W takim przypadku może nie być utworzona instancja. –

5

Po pierwsze, metoda jest po prostu kawałek kodu zamieszkałego pod adresem. Każdy wątek wywołujący metodę będzie miał kopię tej metody i jej zmiennych lokalnych na swoim prywatnym stosie. Tak więc, w przypadku, gdy nie ma innych połowów, powinno być bezpieczne dla wątków.

Case b zależy od wielu czynników:

  • są rzeczywiście dostępu do tych zmiennych składowych?
  • w jaki sposób uzyskujesz do nich dostęp: tylko czyta, czyta i zapisuje, itp.
  • jaki rodzaj zmiennych składowych: struktury danych, pojedyncze wartości.
  • Czy masz synchronizację w miejscu?
  • itp

Generalnie jednak, zakładając robisz dostępu do członków klasy, nie powinno być uważane za bezpieczny wątku.

3

A - Nie. Warunki wyścigu występują tylko wtedy, gdy metody statyczne próbują uzyskać dostęp do zasobu udostępnionego. Zmienna lokalna będzie unikalna dla każdego wątku wywołującego metodę.

B - Tak. Te statyczne elementy będą współdzielone przez wszystkie wątki wywołujące tę metodę.

+0

Zmienna lokalna będzie unikalna, ale co z obiekt, do którego się odnosi? To może być udostępniane. – svick

+0

@ Sick Założę się, że przez "zmienną lokalną" OP NIE oznacza niczego, co zostało przekazane do metody lub zmiennych globalnych. Innymi słowy, zmienną lokalną są obiekty, które zostaną utworzone i umrą w ramach metody. –

Powiązane problemy