Почему черта !Send реализована для RwLockReadGuard и RwLockWriteGuard в Rust?

Недавно я столкнулся с проблемами, пытаясь создать параллельную систему с использованием «Lock Guards», возвращаемого RwLock. Мне нужно было хранить эти блокировки из-за архитектурного дизайна моей системы. К моему удивлению, типы, в которых хранились эти охранники блокировки, не смогли реализовать черту Send, что побудило меня изучить реализацию этих охранников в исходном коде, и, конечно же, я обнаружил черту !Send, реализованную для этих типов.

Я не смог найти никакого реального объяснения того, почему для этих типов реализована черта !Send. Так почему же такое поведение определено в стандартной библиотеке Rust?

(Я предполагаю, что RwLock использует в своей структуре sys::RwLock, который хранит AtomicU32, который должен быть локальным состоянием потока, потому что в целом мы не можем передавать что-либо через границу потока, которая зависит от локального состояния потока нить там сгенерировал блокировку, но опять же я не совсем уверен)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это связано с тем, что на некоторых платформах блокировку необходимо снять в том же потоке, в котором она была получена. Поскольку Rust использует примитивы синхронизации платформы, он должен этого придерживаться.

Например, ReleaseSRWLockExclusive(), который используется в Windows <= 7.

Если вам нужны отправляемые охранники, вы можете использовать park_lot с функцией send_guard.

Чем механизм блокировки в park_lot отличается от механизма блокировки в стандартной библиотеке, если ему также необходимо выделить блокировку с помощью базового вызова ОС?

mitesh 11.04.2024 18:57

@mitesh Потому что park_lot не использует замки платформы. Он реализует блокировки вручную.

Chayim Friedman 11.04.2024 19:04

Но не будет ли это неэффективно? Но на странице crates.io указано, что он в 1,5 раза быстрее. Есть ли какие-то алгоритмические изменения, которые сделают его более эффективным?

mitesh 11.04.2024 20:38

@mitesh Это может удивить, но примитивы синхронизации, предоставляемые ОС, часто работают медленнее, чем возможно, а иногда и намного медленнее. Современные операционные системы также предоставляют более быстрые примитивы (фьютексы), и сегодня их использование в Rust было возможно, поэтому я не знаю, работает ли park_lot по-прежнему в 1,5 раза быстрее (а иногда и медленнее - только сегодня я увидел это в тесте), но в этом нет необходимости. выполнение системного вызова по-прежнему является преимуществом, и я слышал, что park_lot все еще иногда работает быстрее.

Chayim Friedman 11.04.2024 20:45

Не могли бы вы предоставить некоторые ресурсы, где я могу понять, почему это так? Я понимаю, что сохранение системных вызовов — это огромное преимущество, но это также может означать, что мы ставим под угрозу надежность, поскольку примитив на основе ОС может фактически использовать семафоры и атомарные операции, предоставляемые в ядре, для обеспечения такого поведения блокировки, но эти операции могут быть перенесены в пользовательское пространство. .

mitesh 12.04.2024 04:55

Другие вопросы по теме