↓ th分发线程
数组元素   0  1   ...... 9
          ↑     ↑       ......       ↑
          t0     t1       ......        t9  作业线程
如图所示,分发线程th不断的从目录下面读取每一个文件内容,每一个文件的内容放入数组A中的每一个元素中。t0 到 t9 每个线程处理指定的每个数组元素,既t0只处理数组A下标为0的元素内容现在有两种方案:
1,使用读-写锁。th对数组A加写模式锁,线程t0....t9对数组A加读模式锁
2,不加锁。使用一个标志变量int flag等于0或者1,标志每个数组元素内容是否被线程t0...t9处理了。线程th轮询每个数组元素,当某个数组元素内容被处理完之后,th便分发内容给它。
请问,这两种方案是否可行?哪个方案更为优化?多谢大家帮忙了!

解决方案 »

  1.   

    都可以实现,我都用过,但第二个实时性不强,因为想正确执行,应该这么编:
    while(!flag && i<1000)
    {
    i++;
    }
    if(i>=1000)
    没取得资源
    else
    读写操作
    所以应该选第一个,第一个方案更优化
      

  2.   

    第一种情况会不会出现问题:假设线程th每隔1秒往A[0]里面写入内容a,t0每处理一个内容要花20秒时间。当t0还没有处理完a的时候,th又往里面写入内容b,之后又c覆盖b,又d覆盖c。这个时候t0还在处理a呢。会发生这种情况吧?
      

  3.   

    http://baike.baidu.com/view/1445322.htm
      

  4.   

    第一种情况会不会出现问题:假设线程th每隔1秒往A[0]里面写入内容a,t0每处理一个内容要花20秒时间。当t0还没有处理完a的时候,th又往里面写入内容b,之后又c覆盖b,又d覆盖c。这个时候t0还在处理a呢。会发生这种情况吧?
        不会发生这种情况,因为只有t0处理完后才释放资源,这时th才能写入.但按你所说的,处理花的时间长,写入的时间短,这就会发生,写入的数据有可能因为不能写入而溢出或丢失
      

  5.   

    那么假设t0从A[0]取内容a也只需1秒,之后t0处理a需要20秒呢?当t0取出内容后,th就可以往A[0]里面写内容了啊,这样就会发生c覆盖b,又d覆盖c。会发生这种情况吧?