2016-06-09 13 views
7

Zasadniczo mam kilka klas, które wywołują statyczną pustkę, która dostarcza argumenty: (used in an ASP website).Czy metody statyczne bez wątków są bezpieczne?

Z mojego zrozumienia, ponieważ pustka ma własny stos, jest bezpieczna dla wątków, ale nie jestem do końca pewna, czy to prawda, gdy są używane outs. Czy ktoś może wyjaśnić problem? Dzięki!

namespace ThreadTest 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     int helloWorldint = 0; 
     bool helloWorldbool = false; 

     int helloWorldintOut = 0; 
     bool helloWorldboolOut = false; 

     setHelloWorlds(helloWorldint, helloWorldbool, out helloWorldintOut, out helloWorldboolOut); 


     Console.WriteLine(helloWorldintOut); 
     Console.WriteLine(helloWorldboolOut); 
    } 

    public static void setHelloWorlds(int helloWorldint, bool helloWorldbool, out int helloWorldintOut, out bool helloWorldboolOut) 
    { 

     helloWorldintOut = helloWorldint + 1; 
     helloWorldboolOut = true; 

    } 
} 
} 
+2

Gdzie wkraczają wątki? – Markus

+1

@Markus ASP Witryna tej samej puli aplikacji – user6445891

+1

Dlaczego nie zwracać obiektów zamiast używać outs? –

Odpowiedz

2

Z dokumentacji MSDN:

się kluczowe powoduje argumenty mają być przekazywane przez referencję. Jest to podobne do słowa kluczowego ref, z tym że ref wymaga, aby zmienna została zainicjalizowana przed jej przekazaniem. Aby użyć parametru out, zarówno definicja metody, jak i metoda wywołująca muszą jawnie używać słowa kluczowego out.

Tak więc odpowiedź na twoje pytanie zależy od tego, jak nazywasz swoją metodę statyczną. Ponieważ zmienna jest przekazywana przez odniesienie, jeśli masz wiele wątków wywołujących twoją metodę ORAZ one przekazują te same referencje zmiennych co parametry (nawet jeśli te parametry są typami wartości, ponieważ OUT powoduje przekazanie przez explicity referencyjne), wtedy twoja metoda nie jest wątkowo bezpieczna. Z drugiej strony, jeśli wiele wątków wywoła twoją metodę, każda z nich w swoich własnych odniesieniach zmiennych, wtedy twoja metoda będzie bezpieczna dla wątków.

To naprawdę nie jest właściwe dla modyfikatorów OUT lub REF. Każda metoda, która modyfikuje dane na typie referencyjnym, nie jest z natury bezpieczna dla wątków i należy dokładnie rozważyć, dlaczego wybierasz tę trasę. Zwykle, aby metoda była bezpieczna dla wątków, powinna być bardzo dobrze zamknięta.

+0

Dzięki za referencyjny DVK – user6445891

3

Sposób, w jaki wywołujesz metodę statyczną, nie jest bezpieczny dla wątków, ponieważ dzieli się z referencjami. Ale jeśli zwrócisz wartość ze swojej metody i ta zmienna zostanie utworzona w metodzie, może być bezpieczna dla wątków.

static int MyMethod(int input) 
{ 
    var output= 2; 
    ... 
    return output; 
} 
+2

Czy to oznacza w ogóle, ponieważ outs nie może być uważany za Threadafe – user6445891

+1

Tak. Ponieważ wskazują one na odniesienie, które jest udostępniane poza metodą. – akazemis

Powiązane problemy