我有一個簡單的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 thread和background thread。
編輯2:我似乎解決了原來的問題,正如我在下面的答案中所述。然而,這個解決方案導致了兩個相當不受歡迎/可疑的設計選擇:(i)我必須引入節點端點以啓用一個機制來停止服務器(ii)節儉服務的處理程序類(通常需要實例化服務器對象)現在需要一種方式向服務器發送信號以停止,引入各種循環依賴。
關於這些設計問題/選擇的任何建議將不勝感激。
看起來像內存腐敗。你的信號處理程序如何編碼? –
信號處理程序設置一個由主線程監視的標誌。在設置時,主線程在服務器實例(在另一個線程中運行)上調用stop。不知道這是否是一個不行,多線程+節儉的新手。 –
請使用信號處理程序代碼更新您的問題,如果您可以發佈證明問題的[簡短的,自包含的,正確的示例](http://sscce.org/),那也是有益的。 –