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