Почему этот код загрузки динамической библиотеки работает с gcc?

Я предполагаю эти ReentrantLock, мотивирован рекурсивным обходом дерева:

public void doSomething(Node node) {
  // Acquire reentrant lock
  ... // Do something, possibly acquire write lock
  for (Node child : node.childs) {
    doSomething(child);
  }
  // Release reentrant lock
}

разве Вы не можете осуществить рефакторинг свой код для перемещения обработки блокировки за пределами рекурсии?

public void doSomething(Node node) {
  // Acquire NON-reentrant read lock
  recurseDoSomething(node);
  // Release NON-reentrant read lock
}

private void recurseDoSomething(Node node) {
  ... // Do something, possibly acquire write lock
  for (Node child : node.childs) {
    recurseDoSomething(child);
  }
}
31
задан Community 12 April 2017 в 07:31
поделиться

1 ответ

@Eric Lippert Хороший комментарий, но кроме того в ответе на вопрос:

, Какой объект у Вас было бы это, Вы не должны изменять значения в какой-то момент? Я предполагаю не образцовый класс, корректный? Я должен был изменить имя человека в моей базе данных - это не соответствовало бы этой идее.

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

И это трудно сделать, потому что эти вещи всегда влияют на вещи неожиданными способами, данные, изменяющиеся под Вашими ногами.

, Что, если Вы могли бы заморозить свой большой datastructure, когда Вы не обновляете его, так, чтобы никакая память не могла быть изменена и это приостанавливается в согласованном состоянии? Теперь то, когда Вы хотите изменить его снова, необходимо скопировать datastructure в новое место, и это является довольно большим, таким образом, это - оборотная сторона, но позитивный аспект - Вы, ничего не должно будет блокировать, потому что новая копия данных идет неразделенная, пока это не было обновлено. Это означает, что любой в любой точке может прочитать последнюю копию datastructure, делая сложные вещи.

Так да очень полезное понятие, если Вы очень не хотите заниматься проблемами параллелизма и не имеете слишком большого количества данных для контакта с. (Например, если 1 МБ данных и обновления 10/секунда это составляет 10 МБ скопированных данных)

0
ответ дан 27 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: