Jak pisać Thread-Safe klasy

0

Pytanie dla zaawansowanych użytkowników, bo raczej tematyka wielowątkowości do najłatwiejszych nie należy. No właśnie jakich zasad się trzymać, z czego korzystać, jeżeli chcemy zapewnić, żeby nasza klasa była "Thread-Safe" ?

0

Najprościej(teoretycznie) i chyba najlepiej - niezmienne obiekty - podobno wydajność będzie beee, bo się robi dużo obiektów ale to bzdury, oszczędzasz na konieczności synchronizacji.
Z "technik" to np: thread confinement(google it).

Tak ogólnie - w sumie pisząc z perspektywy javy, ale tutaj to też się chyba sprawdzi - to korzystaj z istniejących narzędzi, nie pisz swoich.

0

Druga opcja to przesyłanie danych, a nie dzielenie pamięci. Przykład to aktorzy z Akki (framework na JVM, ale ma port na .NET).

0

Po pierwsze możesz pisać kod, w którym nie posiadasz zasobów współdzielonych między wątkami. Przykładem takiego rozwiązania może być aplikacja ASP.Net MVC w której zwracasz wynik "Cześć " + wartość pola imię. Jeżeli jesteś w stanie coś tak napisać aplikację to o nic nie musisz się martwić.
Drugi krok korzystanie z bibliotek i softu bezpiecznych wątkowo. Np. jeżeli piszesz CRUD-a z bazą SQL to możesz mieć problemy wynikające pośrednio z wielowątkowości ale będą raczej powtarzalne i możliwe do jakiegoś poprawienia.
Jeżeli musisz współdzielić dane w pamięci (np. cache w pamięci RAM) to obiekty immutable mogą nie być najwydajniejsze dalej dają ci dużą szansę na odtworzenie błędów wynikających z wątków i ich naprawę. Niestety w C# nie są jeszcze za dobrze wspierane (np. wykonanie kopii złożonego obiektu ze zmienioną właściwością nie jest trywialne).
Na sam koniec zostają blokady (zarówno te wykorzystujące Mutex jak i SpinLocki) jest to mechanizm, który na pierwszy rzut oka wydaje się prosty jednak z czasem okazuje się wymagać biegłości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1