1. 程式人生 > >zookeeper的c API 單線程與多線程問題 cli_st和cli_mt

zookeeper的c API 單線程與多線程問題 cli_st和cli_mt

.lib libs tool .com tag gnu 編譯選項 watch ||

同樣的程序,在centos和ubuntu上都沒有問題,在solaris上問題卻多多,據說是solaris管理更加嚴格。

zookeeper_init方法,在傳入一個錯誤的host也能初始化出一個非空的handle,只能通過state去判斷是否連接上。

另外,在centos上使用zookeeper_mt才能連上zk,而在solaris上卻不行。

分析src/c中的兩個工具cli_st和cli_mt,發現cli_mt連不上,而cli_st可以連接。於是興沖沖的將編譯選項的庫改為了-lzookeeper_st,結果返回的handle非空,高興壞了,以為成功了,結果呢~,狀態顯示為連接失敗:error code 999,這就是還沒有連接上的表現。

於是開始分析為什麽cli_st工具可以連接上,代碼/src/cli.c文件中沒有什麽特殊的,那就應該是編譯選項的問題了:

gcc -DHAVE_CONFIG_H -I.  -I./include -I./tests -I./generated -D_POSIX_PTHREAD_SEMANTICS  -Wall -Werror  -g -O0 -D_GNU_SOURCE -MT cli.o -MD -MP -MF .deps/cli.Tpo -c -o cli.o `test -f src/cli.c || echo ./`src/cli.c
mv -f .deps/cli.Tpo .deps/cli.Po
/bin/sh ./libtool --tag=CC --mode=link gcc -Wall -Werror -g -O0 -D_GNU_SOURCE -o cli_st cli.o libzookeeper_st.la libtool: link: gcc -Wall -Werror -g -O0 -D_GNU_SOURCE -o cli_st cli.o ./.libs/libzookeeper_st.a -lnsl -lsocket -lm

首先要弄懂libzookeeper_mt.so 和 libzookeeper_st.so有啥區別:

zookeeper的C客戶端分為mt庫和st庫(多線程和單線程),一般操作都是以多線程庫為主。

先記錄到這裏,稍後給結果。

問題原因:

Zk多線程init分為三個線程,主線程,io線程和completion線程,主線程就是調用API的線程,io線程負責網絡通信,對異步請求和watch響應等,IO線程會發給completion線程,由completion線程異步完成:

http://weakyon.com/2015/11/21/analysis-of-zookeeper-c-client-code.html

單線程需要自己註冊zookeeper_interest:

https://github.com/apache/zookeeper/blob/master/src/c/src/cli.c 775行

接下來我們需要看看為什麽在solaris上不能用多線程

zookeeper的c API 單線程與多線程問題 cli_st和cli_mt