Как остановить thrift TNonblockingServer в C ?

#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() он должен быть правильно реализован.