2011-11-19 212 views
3

我有一個簡單的Thrift服務器用例(TSimpleServer),其中有幾條線程(除主線程外)。其中一條新產生的線程進入Thrift事件循環(即server.serve())。在主線程中收到一個信號後,我調用server.stop()這會導致下面發佈的錯誤。停止Thrift服務器(TSimpleServer)

起初我以爲這是一個未捕獲的例外。然而,將server.serve()server.stop()的調用包裝在try-catch中並沒有幫助解決問題。任何想法/建議(關於我應該做什麼)?大多數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:我加入了僞碼爲main thread,在thrift server threadbackground thread

編輯2:我似乎解決了原來的問題,正如我在下面的答案中所述。然而,這個解決方案導致了兩個相當不受歡迎/可疑的設計選擇:(i)我必須引入節點端點以啓用一個機制來停止服務器(ii)節儉服務的處理程序類(通常需要實例化服務器對象)現在需要一種方式向服務器發送信號以停止,引入各種循環依賴。

關於這些設計問題/選擇的任何建議將不勝感激。

+0

看起來像內存腐敗。你的信號處理程序如何編碼? –

+0

信號處理程序設置一個由主線程監視的標誌。在設置時,主線程在服務器實例(在另一個線程中運行)上調用stop。不知道這是否是一個不行,多線程+節儉的新手。 –

+0

請使用信號處理程序代碼更新您的問題,如果您可以發佈證明問題的[簡短的,自包含的,正確的示例](http://sscce.org/),那也是有益的。 –

回答

2

我的問題似乎源於我的代碼/設計,其中我在主線程中調用stop服務器上的「服務器線程」中啓動的信號處理程序代碼。更改此行爲(如pastebin代碼片段中所述)有助於解決此問題。