Как я могу восстановить состояние процесса после катастрофического отказа?

Оператор индексирования из std::vector<> не проверяет индекс. Поскольку это неопределенное поведение, вы можете получить «то, что было раньше», или оно может рухнуть (или «что угодно»).

У вас есть функция-член at, которая будет выдавать, если индекс находится вне диапазона. То есть:

cout << vec.at(0) << " " << vec.size() << endl;

в конце вашего main() будет бросать.

7
задан halfelf 19 December 2018 в 08:43
поделиться

2 ответа

Если это должно быть только во время выполнения, a будет предлагать использование ETS. Ценность намного превышает сложность. API прост, и если вы работаете с именованными таблицами, доступ тоже прост. Вам нужно только создать таблицу до того, как ваш gen_server будет запущен супервизором.

Две - более сложные - альтернативы:

  • Создайте пару процессов, один для выполнения задания, один для обслуживания состояния. Из-за простоты второго он был бы действительно надежным.
  • Настоящей глупостью может быть обмен дочерней спецификации супервизора с текущим состоянием в качестве аргумента каждый раз при изменении состояния. (улыбается) Нет, шучу.
4
ответ дан 7 December 2019 в 10:07
поделиться

есть ли более простой способ?

когда процесс остановился, он отправляет сообщение супервизору, содержащее состояние процесса, поэтому вы можете использовать это значение для сохранения в супервизоре (в мнезии или состоянии супервизора) и когда ваш сервер запустится (в init ), он должен отправить вызов синхронизации супервизору, чтобы получить значение состояния. У меня нет реального примера, но я надеюсь, что это имеет смысл.

В любом случае, я действительно не вижу проблем с сохранением состояния в mnesia.

извините за мой английский :)

2
ответ дан 7 December 2019 в 10:07
поделиться
Другие вопросы по тегам:

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