如何在 C++ 中停止 thrift TNonblockingServer?
Posted
技术标签:
【中文标题】如何在 C++ 中停止 thrift TNonblockingServer?【英文标题】:How to stop thrift TNonblockingServer in C++? 【发布时间】:2011-04-16 07:17:35 【问题描述】:我从一个线程启动一个 TNonblockingServer:
void *start_server(void *)
server->serve();
return NULL;
pthread_create(&daemon_thread, NULL, start_server, NULL);
,并从主线程调用server->stop()
,然后尝试使用pthread_join
等待后台线程优雅退出。然而,主线程在pthread_join
调用时挂起。
如何优雅地关闭 Thrift 服务器?
【问题讨论】:
在等待另一个线程终止时,主线程“挂起”是一种预期。作为对停止命令的响应,它是否正确地执行此操作? 我期望的是,当我从主线程调用 server->stop() 时,后台线程中的 server->serve() 将完成,以便该线程可以退出。因此,在主线程中使用 pthread_join 来等待这个后台线程“start_server()”退出是安全的。但是“pthread_join()”会挂起forever 【参考方案1】:抱歉回复晚了
你只需要停止底层的 libevent
例如,稍微延迟的停止:
tv.tv_usec = 500000;
tv.tv_sec = 0;
event_base_loopexit(myTNonBlockSvr->getEventBase(), &tv);
【讨论】:
【参考方案2】:AFAICT TNonblockingServer::stop()
is not implemented。 TNonblockingServer
析构函数确实会尝试彻底关闭,因此您可能能够删除服务器并关闭服务器。
不过,这是一个完整的 hack,理想情况下 stop()
会得到正确实施。
【讨论】:
以上是关于如何在 C++ 中停止 thrift TNonblockingServer?的主要内容,如果未能解决你的问题,请参考以下文章