停止Thrift服务器(TSimpleServer)

时间:2011-11-19 02:44:06

标签: c++ multithreading boost thrift

我有一个Thrift服务器(TSimpleServer)的简单用例,其中我生成了几个线程(除了主线程)。其中一个新生成的线程进入Thrift事件循环(即server.serve())。在主线程中收到信号后,我调用server.stop(),这导致下面发布的错误。

起初我以为这是一个未被捕获的例外。然而,将server.serve()server.stop()中的try-catchThrift: Fri Nov 18 21:22:47 2011 TServerTransport died on accept: TTransportExc\ eption: Interrupted *** glibc detected *** ./build/mc_daemon: munmap_chunk(): invalid poi\ nter: 0x0000000000695f18 *** Segmentation fault (core dumped) 的调用包装起来并没有帮助隔离问题。任何想法/建议(关于我应该做什么)?大多数Thrift教程/指南/示例似乎都在谈论服务器启动,但似乎没有提到停止场景,这方面的任何指针/最佳实践/建议都会很棒。感谢。

另外,我使用的是thrift-0.7.0。

错误详情:

#0  0x00007fb751c92f08 in ?? () from /lib/libc.so.6
#1  0x00007fb7524bb0eb in apache::thrift::server::TSimpleServer::serve (
    this=0x1e5bca0) at src/server/TSimpleServer.cpp:140
#2  0x000000000046ce15 in a::b::server_thread::operator() (
    this=0x695f18)
    at /path/to/server_thread.cpp:80
#3  0x000000000046c1a9 in boost::detail::thread_data<boost::reference_wrapper<a\
ds::data_load::server_thread> >::run (this=0x1e5bd80)
    at /usr/include/boost/thread/detail/thread.hpp:81
#4  0x00007fb7526f2b70 in thread_proxy ()
   from /usr/lib/libboost_thread.so.1.40.0
#5  0x00007fb7516fd9ca in start_thread () from /lib/libpthread.so.0
#6  0x00007fb7519fa70d in clone () from /lib/libc.so.6
#7  0x0000000000000000 in ?? ()

这里也是堆栈跟踪:

{{1}}

编辑1:我添加了main threadthrift server threadbackground thread的伪代码。

编辑2:我似乎已经解决了原始问题,如下面的答案中所述。然而,这个解决方案导致两个相当不受欢迎/有问题的设计选择:(i)我必须引入一个thrift端点来启用一个机制来停止服务器(ii)thrift服务的处理程序类(通常需要实例化一个服务器) object)现在需要一种方法来向服务器发送信号以停止,引入各种循环依赖。

对这些设计问题/选择的任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

我的问题似乎源于我的代码/设计,其中我在服务器上调用stop的主线程中有信号处理程序代码,该服务器是在'服务器线程'中启动的。更改此行为(如pastebin代码片段中所述)有助于解决此问题。