zookeeper的c API 单线程与多线程问题 cli_st和cli_mt
Posted 狂神314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zookeeper的c API 单线程与多线程问题 cli_st和cli_mt相关的知识,希望对你有一定的参考价值。
同样的程序,在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的主要内容,如果未能解决你的问题,请参考以下文章