Безопасная конкурентность

Безопасная и эффективная обработка конкурентного программирования — ещё одна из главных целей Rust. Конкурентное программирование, в котором разные части программы выполняются независимо, и параллельное программирование, в котором разные части программы выполняются одновременно, становятся всё более важными, поскольку всё больше компьютеров используют преимущества своих многочисленных процессоров. Исторически программирование в этих контекстах было сложным и подверженным ошибкам. Rust надеется это изменить.

Изначально команда Rust считала, что обеспечение безопасности памяти и предотвращение проблем конкурентности — это две отдельные задачи, которые следует решать разными методами. Со временем команда обнаружила, что система владения и типизации — это мощный набор инструментов для управления безопасностью памяти и проблемами конкурентности! Используя владение и проверку типов, многие ошибки конкурентности в Rust становятся ошибками времени компиляции, а не времени выполнения. Поэтому вместо того, чтобы заставлять вас тратить много времени на попытки воспроизведения точных обстоятельств, при которых возникает ошибка конкурентности во время выполнения, некорректный код откажется компилироваться и представит ошибку с объяснением проблемы. В результате вы можете исправить свой код во время работы над ним, а не потенциально после того, как он был выпущен в продакшен. Мы прозвали этот аспект Rust бестрашной конкурентностью. Бестрашная конкурентность позволяет вам писать код, свободный от незаметных ошибок и легко поддающийся рефакторингу без внесения новых ошибок.

Примечание: Для простоты мы будем называть многие проблемы конкурентными, вместо того чтобы быть более точными и говорить конкурентные и/или параллельные. В этой главе, пожалуйста, мысленно подставляйте конкурентные и/или параллельные везде, где мы используем конкурентные. В следующей главе, где различие более важно, мы будем более конкретны.

Многие языки догматичны в отношении решений, которые они предлагают для обработки проблем конкурентности. Например, Erlang имеет элегантную функциональность для конкурентности с передачей сообщений, но имеет лишь малопонятные способы совместного использования состояния между потоками. Поддержка только подмножества возможных решений — это разумная стратегия для языков высокого уровня, потому что язык высокого уровня сулит преимущества от отказа от некоторого контроля ради получения абстракций. Однако от языков низкого уровня ожидается, что они предоставят решение с наилучшей производительностью в любой given ситуации и имеют меньше абстракций над оборудованием. Поэтому Rust предлагает variety инструментов для моделирования проблем любым способом, подходящим для вашей ситуации и требований.

Вот темы, которые мы рассмотрим в этой главе:

  • Как создавать потоки для выполнения нескольких частей кода одновременно
  • Конкурентность с передачей сообщений, где каналы отправляют сообщения между потоками
  • Конкурентность с разделяемым состоянием, где несколько потоков имеют доступ к некоторым данным
  • Трейты Sync и Send, которые расширяют гарантии конкурентности Rust на пользовательские типы, а также на типы из стандартной библиотеки