当前位置: 代码迷 >> C语言 >> liunx C 经过内存共享实现定时的读取数据
  详细解决方案

liunx C 经过内存共享实现定时的读取数据

热度:8558   发布时间:2013-02-26 00:00:00.0
liunx C 通过内存共享实现定时的读取数据
我现在为了计算很多数据的平均值,我不打算通过(a1+a2+a3+a4+...+an)/2进行计算,而是每次输入一个数据就开始计算平均值avg,
例如:输入a1 ,得到avg1 =a1,
      继续输入a2,得到avg2 = (avg1*1+a[2])/(1+1)
      ...
      输入到ai,此时avgi = (avg[i-1]*(i-1)+a[i])/((i-1)+1)...
      到读取到最后一个数的时候,avg[n] = (avg[n-1]*(n-1)+a[n])/((n-1)+1)

这样每次都只需要知道两个参数(前面数据的平均值和当前输入的数据),请问怎样通过共享内存计算得到呢?
Liunx c 共享内存

------解决方案--------------------------------------------------------
没有必要使用共享内存。采用两个线程足以解决问题。不过要注意互斥访问

------解决方案--------------------------------------------------------
这么简单的事情不需要共享内存,针对楼主的方法,我认为可以优化算法:

定义一个total保存目前为止的所有数的总和,这样就不需要每次都执行乘法指令了,

获取数据的线程1和处理数据的线程2,就是一个典型的生产者消费者同步问题。


total = 0; n = 0; avg = 0; 
input a1:   
    total += a1;   
    n++; 
    check n & total 
   avg = total / n; 
input a2:   
    toal += a2;   
    n++; 
    check n & total 
    avg = total / n; 
...
input an:    
    total += an;  
    n++; 
    check n & total 
    avg = total / n; 

------解决方案--------------------------------------------------------
共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……