内存数据更新策略总结

因为后台线程更新数据,而前台继续服务,所以涉及数据共享的问题。

解决方案大致有以下几种:

  1. 使用读写锁
  2. 开辟两份内存,reload时来回切换
  3. 在reload的时候开辟一块内存,切换之后,等待一段时间,前台线程全部切换为新内存后,把老内存释放

方法1效率相对低下,不考虑。

方法2完全可以满足需求,并且不用担心前台线程引用到不可用的数据,如果是配置文件之类,完全没有问题,但是如果占用内存比较可观时,成本较高,可行性不高。

方法3效率高且不需要长期占用双份内存,是较好的方法,但是在实践中,还是需要注意一些问题:

  • 读取数据的线程,需要将一个临时指针指向使用的数据(不要使用成员指针),防止在查询过程中(可能有遍历等比较费时的操作)内存被更新的问题,可能导致程序core掉。
  • sleep的时间尽可能长些,以等待后台线程更新内存(要考虑到如果更新线程每次是新起的话,更新间隔不能太小,如果是单一线程,就不用考虑这问题)

两道关于指针的C语言笔试题

实验室的师兄师姐为找工作都在狂做C/C++的笔试题,偶们也掺和了下,做了两道指针方面的,大家一起来看看吧。

1. 求n的值。

int a[20];
char * p1 = (char * )a;
char * p2 = (char *)(a+5);
int n= p2-p1;
答案:20。
解析:int为4个字节,char为1个字节。a是int*型指针,加减运算以4个字节为单位,a+5便会指向第20个字节;而p1,p2是char*型,它们进行加减运算时以1个字节为单位。于是p1指向第1个字节而p2指向第21个字节,于是21-1=20,n的值为20。

2. 求 * p 的值。

Continue reading “两道关于指针的C语言笔试题”

深入理解C语言指针的奥秘

–转自http://blog.programfan.com/article.asp?id=22552
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。
Continue reading “深入理解C语言指针的奥秘”