@21小跑堂 #申请原创
1 背景介绍以及问题
此方法用于工业数据采集的数据保存, 更新的数据同步方案。
对于工业现场来说,数据型的点位数量多,且更新快,不定序。所以读写比较频繁,实时性要求高一点点。
常用方法就是得到的每一个更新的点位数据,申请空间保存,然后使用先入先出数据结构保存,以及更新到用户层。
此种方案的好处是不缺少任何一个更新的数据,缺点是实时性差一点,如果点位更新的数据比更新数据的任务线程消耗的还快,那点位更新延迟性会越来越高。而且点位的保存地址不固定,会频繁的在堆空间申请释放内存,局部性特性差,性能会很低。
2 解决方法
引入uthash表的头文件,以点位名字为关键字创建hash表,每个hash表的节点的数据字段保存点位数据结构的指针。节点的数据结构里创建更新的标记位,如此方式实现了全部点位空间的申请。
当有点位更新时候,解析所有的点位数据,通过节点名字获取到hash表节点,将点位数据更新到数据字段中,最后修改点位的更新标志位为已更新。
更新的任务线程,定期遍历所有节点,如果标志位为更新状态,则取出所有的数据,然后修改点位为未修改。
此种方案,可解决c语言中最恶心的内存泄漏或者double free 问题,且点位数据最多,也可以轻松应付。可谓省心省力。
|