Нужно ли использовать какую-то внутреннюю изменчивость, чтобы создать цикл между двумя дугами? - PullRequest
1 голос
/ 21 июня 2019

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

struct DataDeclaration {
    parent: Option<Arc<DataDeclaration>>,
    children: Option<Vec<Weak<DataDeclaration>>>,
    properties: HashMap<Identifier, DataDeclarationProperty>,
}

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

Чтобы создать это дерево, нужно ли использовать Mutex или RwLock изстандартная библиотека или parking_lot?Будет ли отрицательное влияние на производительность, если я использую блокировку только для чтения?

1 Ответ

4 голосов
/ 21 июня 2019

мне нужно использовать Mutex или RwLock

Да.

Нет практического способа сделать так, чтобы тип был временно изменяемым, пока вы его конструируете, а затем "отбросил" способность изменяться в течение некоторого периода времени (до разрушения, когда он должен снова стать изменяемым)

Будет ли отрицательное влияние на производительность

Да.

Будет ли воздействие значимым или важным? Это зависит от целого ряда факторов, которые не подлежат ответственности за рамками всей вашей программы, и от конкретного набора применений.

Воздействие, вероятно, будет выше, если вы используете Mutex вместо RwLock, так как Mutex разрешает доступ только одному потоку за раз. RwLock допускает несколько одновременных потоков.

Смотри также:


Здесь все также верно для однопоточных контекстов, заменив Arc на Rc и RwLock на RefCell.

...