码迷,mamicode.com
首页 > 编程语言 > 详细

zookeeper的c API 单线程与多线程问题 cli_st和cli_mt

时间:2017-10-09 11:01:01      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:int   soc   初始化   logs   客户端   class   编译选项   anti   pthread   

同样的程序,在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

标签:int   soc   初始化   logs   客户端   class   编译选项   anti   pthread   

原文地址:http://www.cnblogs.com/kuang17/p/7639854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!