2012-12-05 8 views
5

Na przykład, metody, takie jak:Czy metody klasy Ruby są wątkowo bezpieczne?

class MyClass 
    self.perform(id) 
    hash = doSomething(id) 
    doMoreStuff(hash) 
    return hash 
    end 
end 

Obawiam się, jeśli mam wiele wątków wzywające MyClass.perform(). Czy obiekt hash mógł zostać potencjalnie nadpisany przez inny wątek? Innymi słowy, wątek 1 wywołuje doSomething i otrzymuje wartość skrótu z {1 => 1}. Ale zaraz potem wątek 2 wywołuje doSomething i otrzymuje skrót od {2 => 2}. Co się teraz stanie? Czy skrót wątku 1 zmienił się na {2 => 2}?

Lub czy każdy wątek działa samodzielnie hash, który nigdy nie może zostać dotknięty przez inne wątki? Załóżmy, że doSomething i doMoreStuff są już wątkowo bezpieczne.

Jeśli to ma znaczenie, używam Rails 3.0.

+0

Z tego co wiem, na przykład na szynach, nie są one – macool

+0

Czy możesz wyjaśnić, jakie obawy związane z bezpieczeństwem gwintu masz w związku z tą metodą? –

+1

Nie ma również potrzeby "powrotu" na końcu metody. Jeśli po prostu masz 'hash' w ostatnim wierszu, będzie to wartość zwracana. –

Odpowiedz

16

Zmienne lokalne, takie jak hash, są lokalne dla konkretnego wywołania otaczającej metody. Jeśli dwa wątki kończą się wywoływaniem perform w tym samym czasie, każde wywołanie będzie miało swój własny kontekst wykonania, a te nie będą nakładały się, chyba że są zaangażowane zasoby udostępnione: zmienne instancji (@hash), zmienne klasy (@@hash), globals ($hash) , ... może powodować problemy z współbieżnością. Nie ma się czym martwić o nici z czymś prostym, takim jak Twój perform.

Jednak jeśli perform tworzył wątki i skończyło się zamknięciami wewnątrz perform, mógłbyś otrzymać kilka wątków odwołujących się do tych samych zmiennych lokalnych przechwyconych przez zamknięcia. Musisz więc uważać na problemy z zasięgiem, gdy tworzysz wątki, ale nie musisz się tym martwić, gdy masz do czynienia z prostymi metodami, które działają tylko ze zmiennymi lokalnymi.

1

Coś będącego "metodą klasy" (która jest tylko metodą singleton na obiekcie klasy) nie czyni jej bardziej bezpieczną dla wątków niż metoda instancji.

+1

@Downvoter, gdy odpowiedź została napisana, pytanie było naprawdę niejasne i nie mogłem podać znacznie więcej informacji niż to. Nadal próbuję wyjaśnić, o co prosi OP, więc proszę nie odrzucaj tej odpowiedzi. –

Powiązane problemy