我有一个 Thrift 服务器的简单用例(TSimpleServer
)其中我生成了几个线程(除了主线程之外)。新生成的线程之一进入 Thrift 事件循环(即server.serve()
)。在主线程中收到信号后,我调用server.stop()
这导致了下面发布的错误。
起初我以为这是一个未捕获的异常。然而,包装这两个调用server.serve()
and server.stop()
in try-catch
这无助于隔离问题。有什么想法/建议(关于我应该做什么)?大多数 Thrift 教程/指南/示例似乎都在谈论服务器启动,但似乎没有提及停止场景,这方面的任何指针/最佳实践/建议都会很棒。谢谢。
另外,我正在使用 thrift-0.7.0。
错误详情:
Thrift: 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)
这也是堆栈跟踪:
#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:我添加了伪代码主线程 http://pastebin.com/CqNgLxnf, the 节俭服务器线程 http://pastebin.com/ZKVTUDeq和后台线程 http://pastebin.com/67r7vwEW.
编辑2:我似乎已经解决了最初的问题,如下面我的回答中所述。然而,这个解决方案导致了两个相当不受欢迎/有问题的设计选择:(i)我必须引入一个 thrift 端点来启用一种停止服务器的机制(ii)thrift 服务的处理程序类(通常需要实例化服务器)对象)现在需要一种方法来向服务器发出停止信号,从而引入了某种循环依赖。
对于这些设计问题/选择的任何建议将不胜感激。
我的问题似乎源于我的代码/设计,其中我在主线程中调用了信号处理程序代码stop
在“服务器线程”中启动的服务器上。更改此行为(如 Pastebin 代码片段中所述)有助于解决此问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)