内存数据更新策略总结

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

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

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

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

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

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

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

JAVA volatile关键字特性备忘

  1. 对volatile变量的读写有一个全局的排序,但是volatile变量跟常规变量的读写顺序没并没有保证
  2. volatile的值不会被缓存,所有线程读取到的都是当前的(主存中的)值
  3. 对volatile的变量的读写好像是用了synchronized包围起来一样

MFC多核多线程编程遇到的问题总结

  1. 多线程编程必须有操作系统为基础,知道什么是互斥、临界区、事件、信号量等概念;
  2. 知道线程是CPU资源分配的基本单位;
    给线程分配CPU,可以用:SetThreadAffinityMask(tHandle,0x00000001)函数,tHandle表示线程的HANDLE(不是CWinThread*),第二个参数表示可以使用的CPU的编号,0x00000001表示只能使用第一个CPU;如果0x00000011,表示可以使用第一和第二个CPU,依此类推; Continue reading “MFC多核多线程编程遇到的问题总结”

Win32下多核多线程编程

我们通常写的程序都是单线程的,当程序运行一个任务时,我们只能等待,什么也干不了,多线程的存在十分必要。然而,多线程的运用不止于此,现在多核已经十分普及,在大运算量的情况下,多个线程并行运行于多核会使运算的速度倍增,多核多线程的程序具有很大的优势。
Continue reading “Win32下多核多线程编程”