Chinaunix
标题:
如何实现linux c下的观察者模式,有推荐的基础库没
[打印本页]
作者:
image_s
时间:
2016-01-23 15:34
标题:
如何实现linux c下的观察者模式,有推荐的基础库没
linux c下貌似没有提供观察者,发布/订阅这种模式的通信模型,而java,android都在语言级或系统级提供了相关的接口,方便开发者的开发工作。
不知道在linux下做c开发的,都是如何解决类似的问题/需求。
目前我遇到的问题就是n个线程,都想获取某个事件变化的消息,如何实现这种1对n的消息通知,不知道大家是如何解决的,
是否有一些开源的基础库,又或者有其他方式解决解决我上面提到的需求。
谢谢!
作者:
cokeboL
时间:
2016-01-23 16:11
你监听某个 signal,有事情的时候给你发个,相当于观察者。
自己实现,就是key-value和data,key是事件,value是你的handler,data是事件发生时传给你的handler的参数,随便搞搞,不就有了。
作者:
image_s
时间:
2016-01-24 13:15
回复
2#
cokeboL
1.signal的话,由于状态比较多,要注册很多处理函数,并且貌似多线程中signal不是很好用,处理不好就crash了
2.自己实现key-value这种,主要就是不同线程间消息的传递,线程x的事件不可能依次给其他线程2,线程3,... 线程n发消息啊。
作者:
image_s
时间:
2016-01-24 13:16
回复
2#
cokeboL
1.signal的话,由于状态比较多,要注册很多处理函数,并且貌似多线程中signal不是很好用,处理不好就crash了
2.自己实现key-value这种,主要就是不同线程间消息的传递,线程x的事件不可能依次给其他线程2,线程3,... 线程n发消息啊。
作者:
image_s
时间:
2016-01-24 13:17
回复
2#
cokeboL
1.signal的话,由于状态比较多,要注册很多处理函数,并且貌似多线程中signal不是很好用,处理不好就crash了
2.自己实现key-value这种,主要就是不同线程间消息的传递,线程x的事件不可能依次给其他线程2,线程3,... 线程n发消息啊。
作者:
zhouzhenghui
时间:
2016-01-24 18:45
github.com/zhouzhenghui/c-sigslot/
作者:
zhanglin496
时间:
2016-01-25 10:49
本帖最后由 zhanglin496 于 2016-01-25 10:53 编辑
1、楼主可能是需要一个消息总线机制,可以参考ubus, dbus,自己用unix域套机字实现也可以,或者不想管理资源,可以利用netlink的广播机制,但是要写一个内核模块。
2、我也建议不要用传统的signal信号方式,连linux都提供了singalfd函数,还是转化为套接字来处理比交符合趋势。
作者:
cokeboL
时间:
2016-01-25 11:52
回复
3#
image_s
signal只是举例子相当于观察者,signal打断和多线程都不好
key value实现,跟线程无关,放全局的,需要同步之类的是你自己在回调里处理的
作者:
cjaizss
时间:
2016-01-25 12:57
自己开个端口慢慢搞呗
作者:
hanxin83
时间:
2016-01-25 13:28
cjaizss 发表于 2016-01-25 12:57
自己开个端口慢慢搞呗
正想说这个, 非C/C++系的就爱各种架构各种模式各种组件, 然后制造各种问题, 然后投入各种人力解决各种问题......
C/C++的人爱直接开个TCP端口, 谁订阅, 谁连接上来, 我有事抄送你一份.....
作者:
linux_c_py_php
时间:
2016-01-25 14:14
queue+mutex+cond,这不是基础开发知识吗。
作者:
image_s
时间:
2016-01-25 22:58
本帖最后由 image_s 于 2016-01-25 23:11 编辑
回复
10#
hanxin83
“ C/C++的人爱直接开个TCP端口, 谁订阅, 谁连接上来, 我有事抄送你一份.....”
这种方法是可以解决我提到的问题,但是会稍显麻烦,比如有五个线程,1,2,3,4,5,6
1产生a事件
2产生b事件
3.....c事件
2,4,5,6都关心a事件,那就都要和1建立连接,
1,3,5,6都关心b事件,也要分别于2建立连接,
这样每个线程要想获取关心的事件都要了解是哪个线程产生,在哪个端口,地址。
而java或android中,我只需要订阅下我关心的事件,注册回调就好了,完全不关心事件的产生者,并且如果事件的产生有两个以上的话,上面的连接数量就要翻n倍。
另外我是一直做c/c++的,只是了解过android的,发现有些架构的东西确实是有它的好处的。
作者:
image_s
时间:
2016-01-25 22:58
回复
11#
linux_c_py_php
这个的确是基础,只是开发起来太麻烦,复杂度很高!
作者:
image_s
时间:
2016-01-25 23:10
回复
7#
zhanglin496
谢谢你的回复,我看了下ubus貌似是我需要的东西,不过还没时间仔细看,明天研究下,netlink应该不需要,不涉及内核,unix socket应该可以搞定了。
另外我昨天基于unix socket做了个模型,原理应该差不多,就是做一个server管理接受订阅,分发事件,做个转发,这样目的只是想让订阅方,不关心事件发起方的细节,来解耦。
之所以开这个贴就是感觉应该有一些解决这个需求的库(这个需求感觉应该还蛮普遍的),不想自己造轮子,不过找了一圈没看到,就先自己写个,自己用用了。
作者:
moxies
时间:
2016-02-23 14:22
redis咋实现的啊?
作者:
xphh2008
时间:
2016-02-23 20:49
对的,redis就行了。
其实楼主没说清楚,你的程序是单进程还是多进程?多进程的话开个redis,甚至各种MQ服务都可以,基本上主流的MQ服务都有C客户端SDK的。
作者:
xphh2008
时间:
2016-02-23 20:50
另外,zookeeper也不错。
作者:
image_s
时间:
2016-02-24 22:49
回复
16#
xphh2008
redis对于我的需求太重型了,嵌入式设备上跑的。不过打算看下redis怎么实现的,看能不能把MQ部分剥离出来。谢谢!
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2