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的主要内容,如果未能解决你的问题,请参考以下文章

单线程与多线程

Redis单线程与多线程模型

Redis单线程与多线程模型

操作系统基础知识之————单线程(Thread)与多线程的区别

单线程与多线程的区别

单核和多核,单进程和多进程,单线程与多线程