使用背景:通过网络对多个设备进行固件升级。(假设网络带宽,以及硬件性能均不是问题)
技术方法:为每个设备建立单独的通讯线程,这样可以多个设备同时升级、提高效率。(几十个线程)
问题是:此时磁盘上只有一个升级文件(bin文件),升级过程中需要多次读取bin文件的不同位置(几千次读操作)。这就面临多个线程要访问同一个资源的问题。所以目前有两种方法可供选择:
1. 避免共享问题
   1.1 方法:预先在一个文件夹下,手动拷贝多个bin文件,为每个设备打开不同的bin文件,实现独占资源。
       评论:这个办法是可行的,但是太蛮力了。
   1.2 方法:有没有办法,打开磁盘文件的时候,能产生独立的内存映射,每次打开产生一个独占的资源???
       评论:这个方法会比较好用。
  
2. 使用线程同步技术
技术:使用关键段(或Slin读/写锁)等技术对bin文件的读操作进行保护。
评论:但是当线程非常多的时候,不可避免的会产生抢占资源的冲突,当线程达到30+的时候会不会造成性能很大的下降。
     对这个线程访问没有太多的经验,还希望有经验的同学指点一下,是否真的如我想象的这样?///////////////////////////////////////////////////////////////////////////
所以比较倾向于避免共享问题的方法,这里又属方法1.2比较常规通用。
如果行不通,只能使用方法1.1了。

解决方案 »

  1.   

    你的这个问题处理实际上是比较容易的.首先,如果你的文件不大的话,因为据你的描述是多个线程在读同一个文件,所以可以考虑直接把整个bin文件读入内存之中,然后每个线程都拥有对该内存读的权限.因为所有线程都是读操作,所以,根本不用考虑互斥的问题.每个线程之中,记录一下读到该内存的哪个位置了,就像是读文件一样,有一个当前位置与结束位置.读完了就结束,所有线程都不在访问的时候,可以释放读文件所申请的内存.这做有一个好处,就是不存在多个线程都去访问IO,因为IO效率是最低的,只有放到内存里面效率是最高的.赶紧给分吧.
      

  2.   

    1.1 和 1.2 都可以,又都有问题,把问题想复杂了。“手动拷贝多个bin文件,为每个设备打开不同的bin文件,实现独占资源。”这个没必要,只是读文件,不用独占资源,以共享方式打开,大家一起打开读就行,不会互相影响。“能产生独立的内存映射,每次打开产生一个独占的资源”没必要一线程独占一个资源。方法2是错误的,不能把文件锁死,如果锁死别的线程就不能用了。楼上的方法可行,可以试一下,祝好运。