#c #multithreading #rpc #thrift
#c #многопоточность #rpc #бережливость
Вопрос:
Я запускаю TNonblockingServer из одного потока:
void *start_server(void *) {
server->serve();
return NULL;
}
pthread_create(amp;daemon_thread, NULL, start_server, NULL);
и вызывайте server->stop()
из основного потока, затем попробуйте использовать pthread_join
для ожидания корректного завершения фонового потока. Однако основной поток зависает при pthread_join
вызове.
Как я мог бы корректно завершить работу сервера thrift?
Комментарии:
1. Ожидается, что основной поток «зависает» в ожидании завершения другого потока. Правильно ли это выполняется, как ответ на команду stop?
2. Чего я ожидал, так это того, что когда я вызываю server-> stop() из основного потока, сервер-> serve() в фоновом потоке завершится, так что этот поток может завершиться. Поэтому было бы безопасно использовать pthread_join в главном потоке, чтобы дождаться завершения этого фонового потока «start_server()» .. однако «pthread_join()» зависает навсегда
Ответ №1:
Извините за поздний ответ
Вам просто нужно было бы остановить базовый libevent
Например, слегка отложенная остановка:
tv.tv_usec = 500000;
tv.tv_sec = 0;
event_base_loopexit(myTNonBlockSvr->getEventBase(), amp;tv);
Ответ №2:
Ошибка TNonblockingServer::stop()
не реализована. TNonblockingServer
Деструктор все же пытается выполнить чистое завершение работы, так что вы, возможно, сможете удалить server и завершить работу сервера.
Однако это полный взлом, и в идеале stop()
он должен быть правильно реализован.