Существует несколько типов потоковых реакторов: ServerWriteReactor, ServerReadReactor, ServerBidiReactor.
В этих примерах есть код, который учит нас: когда соединение намеренно закрывается на стороне сервера, запускается обратный вызов OnDone(). Унаследованный класс удаляет свой экземпляр следующим образом:
Код: Выделить всё
class Lister : public grpc::ServerWriteReactor
{
public:
...
void OnDone() override { delete this; }
....
}
Проблема в том, что в gRPC/Example/cpp нет ни одного примера, показывающего, как правильно использовать эту функцию, если она переопределена классом пользователя.
Если мы поместим туда тот же код (удалить этот), последующий вызов grpc::Server::ShutDown() никогда не вернется, если вы хотите закрыть серверную часть формы соединения. Иногда, если поток данных используется интенсивно, мы очень скоро получаем внутреннее исключение gRPC. Таким образом, небезопасно помещать один и тот же код (удалять это) в функцию OnCancel()...
Итак, возникают вопросы:
- как правильно обрабатывать OnCancel() в серверных реакторах потокового типа?
- В какой момент можно безопасно удалить экземпляр серверного реактора после того, как мы получили OnCancel() сработало?
Подробнее здесь: https://stackoverflow.com/questions/767 ... r-reactors
Мобильная версия