Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Bezpieczna współbieżność

Bezpieczne i efektywne zarządzanie programowaniem współbieżnym to kolejny z głównych celów Rust. Programowanie współbieżne, w którym różne części programu wykonują się niezależnie, oraz programowanie równoległe, w którym różne części programu wykonują się w tym samym czasie, stają się coraz ważniejsze, ponieważ coraz więcej komputerów wykorzystuje swoje wieloprocesorowe możliwości. Historycznie programowanie w tych kontekstach było trudne i podatne na błędy. Rust ma nadzieję to zmienić.

Początkowo zespół Rust uważał, że zapewnienie bezpieczeństwa pamięci i zapobieganie problemom współbieżności to dwa oddzielne wyzwania do rozwiązania różnymi metodami. Z czasem zespół odkrył, że systemy własności i typów to potężny zestaw narzędzi pomagających zarządzać zarówno bezpieczeństwem pamięci, jak i problemami współbieżności! Dzięki wykorzystaniu własności i sprawdzania typów, wiele błędów współbieżności w Rust to błędy kompilacji, a nie błędy czasu wykonania. Dlatego, zamiast zmuszać Cię do spędzania wielu godzin na próbach odtworzenia dokładnych okoliczności, w których występuje błąd współbieżności w czasie wykonania, niepoprawny kod odmówi kompilacji i wyświetli błąd wyjaśniający problem. W rezultacie możesz naprawić swój kod podczas pracy nad nim, a nie potencjalnie po jego wdrożeniu do produkcji. Nazwaliśmy ten aspekt Rust bezpieczną współbieżnością. Bezpieczna współbieżność pozwala pisać kod wolny od subtelnych błędów i łatwy do refaktoryzacji bez wprowadzania nowych błędów.

Uwaga: Dla uproszczenia będziemy odnosić się do wielu problemów jako współbieżnych, zamiast być bardziej precyzyjnym, mówiąc współbieżnych i/lub równoległych. W tym rozdziale proszę mentalnie zastępować współbieżnych i/lub równoległych za każdym razem, gdy używamy współbieżnych. W następnym rozdziale, gdzie rozróżnienie ma większe znaczenie, będziemy bardziej precyzyjni.

Wiele języków jest dogmatycznych w kwestii rozwiązań, które oferują do obsługi problemów współbieżności. Na przykład, Erlang ma elegancką funkcjonalność dla współbieżności opartej na przekazywaniu wiadomości, ale ma tylko niejasne sposoby udostępniania stanu między wątkami. Obsługiwanie tylko podzbioru możliwych rozwiązań jest rozsądną strategią dla języków wyższego poziomu, ponieważ język wyższego poziomu obiecuje korzyści z oddawania części kontroli w zamian za abstrakcje. Jednak od języków niższego poziomu oczekuje się, że zapewnią rozwiązanie o najlepszej wydajności w każdej danej sytuacji i będą miały mniej abstrakcji nad sprzętem. Dlatego Rust oferuje różnorodne narzędzia do modelowania problemów w sposób odpowiedni dla twojej sytuacji i wymagań.

Oto tematy, które omówimy w tym rozdziale:

  • Jak tworzyć wątki do jednoczesnego uruchamiania wielu fragmentów kodu
  • Współbieżność oparta na przekazywaniu wiadomości, gdzie kanały wysyłają wiadomości między wątkami
  • Współbieżność oparta na współdzielonym stanie, gdzie wiele wątków ma dostęp do pewnej części danych
  • Cechy Sync i Send, które rozszerzają gwarancje współbieżności Rust na typy zdefiniowane przez użytkownika, a także na typy dostarczane przez bibliotekę standardową