如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

thrift在C++中的应用

Thrift RPC的一个简单c++ demo

thrift c++ windows 依赖哪些库

Thrift安装介绍

Haskell Thrift 库在性能测试中比 C++ 慢 300 倍

c++访问hbase