Arhn - архитектура программирования

Есть ли общий указатель с одним сильным владельцем и несколькими слабыми ссылками?

Я ищу интеллектуальный указатель, похожий на Arc/Rc, за исключением того, что он не допускает совместного владения.

Я хочу иметь столько ссылок rc::Weak, сколько мне нужно, но мне нужна только одна надежная ссылка, также известная как владелец. И я хочу обеспечить это с помощью системы типов.

Arc/Rc можно клонировать, и ими можно владеть в нескольких местах.

Можно было бы свернуть мой собственный интеллектуальный указатель, но я считаю, что такая структура данных уже должна существовать, даже если она находится за пределами стандартной библиотеки.

Я ищу структуру данных, обеспечивающую такой интерфейс:

impl MySmartPointer<T> {
    fn new(object: T) -> Self;
    fn weak_ref(&self) -> WeakRef<T>;
    fn get_mut(&mut self) -> &mut T;
}

impl WeakRef<T> {
    /// If the strong pointer `MySmartPointer` has been dropped,
    /// return `None`. Else return Some(&T);
    fn get(&self) -> Option<&T>;
}
07.06.2018

  • Вы имеете в виду что-то вроде RwLock? 08.06.2018
  • Не думаю, что RwLock поможет. Несмотря на то, что RwLock может принадлежать одному месту, я не думаю, что могу разбрасываться слабыми ссылками на значение, инкапсулированное RwLock. Что делать, если оригинальный RwLock будет удален? 08.06.2018
  • Просто для информации, что такое вариант использования для этого? 08.06.2018
  • Блокировки @JorgeIsraelPeña RW могут разрешить вход большему количеству читателей или большему количеству писателей. У них могут быть разные уровни авторов, которые более или менее заставляют читателей ждать... Последний (или последний и единственный) master_strong владелец ресурса может решить аннулировать слабых владельцев, позволяя только тем, кто уже обновился до strong_from_weak, которые не сможет создать больше владельцев. Мы закрываемся, только клиенты в очереди могут проверить решение. 10.06.2018

Ответы:


1

Предположим, что он существует с типами Strong<T> и Weak<T>. Как вы используете Weak<T>? Вам нужен какой-то ошибочный шаг «обновления», так до чего обновляется Weak<T>? Это не может быть простая ссылка (как вы сказали), потому что Strong<T> должно знать, существуют ли какие-либо «обновленные» Weak<T>. В противном случае он может освободить свое хранилище, пока значение все еще используется.

Таким образом, Weak<T> должен быть обновлен до какого-то типа SemiWeak<T>, который поддерживает базовое распределение... а это именно то, что является общим владением.

Что, если бы вы каким-то образом гарантировали, что Strong<T> нельзя будет освободить до того, как все Weak<T> исчезнут? Поздравляем, вы только что заново изобрели T и &T: вместо них вы могли бы буквально использовать их.

Итак, а что, если вы сделали так, чтобы Weak<T> обновлялся до SemiWeak<'a, T>, привязанного к сроку службы Weak<T>, так что он не может пережить его, а может только быть временным? Все, что вы на самом деле делаете в этом случае, — это скрываете тот факт, что у вас есть совместное владение. Под капотом SemiWeak все еще нужно гарантировать, что лежащий в основе Strong не исчезнет. Вы можете тривиально построить такой тип из Rc<T> примерно за десять минут. Это фактически даст вам тип, который точно такой же, как Rc<T>, с той же производительностью и затратами памяти, но менее полезный.

Кроме того, этот метод get_mut не может существовать. Невозможно предотвратить существование SemiWeak<T>. Если вы не используете заимствование, но, опять же, это просто использование T и &T.

Итак, нет, я не думаю, что это существует, и я не верю, что может быть в той форме, которую вы описали.


И наконец, наличие Weak<T> вообще является формой совместного владения, потому что эти Weak<T> должны указывать на что-то. В случае Rc<T> слабый счетчик хранится рядом с сильным счетчиком, поэтому, хотя значение может быть уничтожено, выделение само сохраняется. Вы могли бы разделить их, но теперь вы платите за два выделения и двойную косвенность (вероятно, приводящую к большему количеству промахов кеша).

08.06.2018
  • IOW, слабая ссылка — это сильная ссылка на метаинформацию. 09.06.2018
  • У вас все еще может быть куча сильных ссылок и более слабых сильных ссылок, которые поддерживают жизнь объекта, но не позволяют обновлять слабые ссылки. Магазин закрывается, некоторым покупателям по-прежнему будет разрешено покупать то, что у них есть в корзине, другим придется уйти... Вы можете запретить некоторым покупателям обновляться, чтобы закрываться раньше. 10.06.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..