Size: a a a

2020 September 28

MB

Mikail Bagishov in Rust Async
А он разве не реализует Clone или Debug?
источник

К

Кирилл in Rust Async
Реализует. Но у меня есть !Clone структура, которая содержит Sender. Я хочу сделать её Sync.
источник

К

Кирилл in Rust Async
И мне кажется, что mutex здесь будет лишним.
источник

MB

Mikail Bagishov in Rust Async
Ну тогда ты должен гарантировать, что не будет одновременного доступа к этому сендеру из разных потоков.
источник

MB

Mikail Bagishov in Rust Async
Кирилл
И мне кажется, что mutex здесь будет лишним.
Ты можешь везде вместо lock использовать try_lock().unwrap()
источник

MB

Mikail Bagishov in Rust Async
Если будут паники, то ты чуть не пропустил UB.
Если не будет, и ты веришь в свою внимательность, то убирай мьютекс.
источник

К

Кирилл in Rust Async
Если я сделаю обёртку над Sender, у которой send(&mut self) и вручную заимплементирую для неё Sync, это будет гарантировать, что у меня send() не вызывается многократно параллельно?
источник

MB

Mikail Bagishov in Rust Async
Да. Но тогда еще нужно не дерайвить Clone, Debug, etc.
В таком случае по-моему все должно быть хорошо.
источник

MB

Mikail Bagishov in Rust Async
А, смешно. В таком случае опять-таки используй мьютекс.
источник

MB

Mikail Bagishov in Rust Async
Но уже get_mut()
источник

К

Кирилл in Rust Async
Не понял. А зачем мютекс?
источник

MB

Mikail Bagishov in Rust Async
Чтобы вообще без ансейфа было
источник

К

Кирилл in Rust Async
Меня !Clone вполне устраивает.
источник

К

Кирилл in Rust Async
Mikail Bagishov
Но уже get_mut()
Спасибо за подсказку
источник

MB

Mikail Bagishov in Rust Async
А если ансейф, то такой:
struct Wrapper<T> {
   inner: T
}

unsafe impl<T: Send> Sync for Wrapper<T>

impl<T> Wrapper<T> {
  fn get(&mut self) -> &T {&self.inner}
}
источник

MB

Mikail Bagishov in Rust Async
И тогда ты совершенно точно не прострелишь себе ногу в будущем, а код при этом зирокостный
источник

К

Кирилл in Rust Async
Спасибо. Ещё подумаю, какой вариант выбрать. С unsafe пока нравиться больше.
источник

К

Кирилл in Rust Async
Mikail Bagishov
А если ансейф, то такой:
struct Wrapper<T> {
   inner: T
}

unsafe impl<T: Send> Sync for Wrapper<T>

impl<T> Wrapper<T> {
  fn get(&mut self) -> &T {&self.inner}
}
Тут, кстати, я и Clone могу сделать для T: Clone
источник

MB

Mikail Bagishov in Rust Async
Кирилл
Тут, кстати, я и Clone могу сделать для T: Clone
Нет, в общем случае не можешь. Пример: Rc, он при копировании выполняет потоконебезопасные операции. Следовательно, если два потоко одновременно скопируют Wrapper<Rc<...>>, то произойдет UB
источник

К

Кирилл in Rust Async
Так Rc же !Send
источник