小弟最近在看线程的问题,有一个想法不太明白,请各位详解。
1 声明一个公共数组(大小100000),对其加锁,然后用多个线程(假设是10个)处理公共数组的数据。
2 创建10个线程,然后将数组平分成10个数组(每个数组大小10000),每个线程处理各自的子数组。
请问这两种做法有什么区别?哪个好?

解决方案 »

  1.   

    1 声明一个公共数组(大小100000),对其加锁,然后用多个线程(假设是10个)处理公共数组的数据。
    2 创建10个线程,然后将数组平分成10个数组(每个数组大小10000),每个线程处理各自的子数组。
    请问这两种做法有什么区别?哪个好?
    -------------------------------------------------------------------------------------------
    例: 1000个医院就诊号(有先后次序), 10个挂号员
    怎么分断合理? 前100个号给1号挂号员? 答案:否定
    假如初期平均分配合理, 某个挂号员偷懒不放号咋办?  答案:否定多线程能保证1000个号顺序高效的放出:
    1000个号放一起, 同一时间点只能一个挂号员占一个号, 办理完毕(询问, 打印等流程)后, 再去排队拿号
      

  2.   

    第一种情况:一个大的数组,在同一时间只允许一个线程去处理,其他线程需要等待别的线程释放这个大数组才能去处理。
    第二种情况:10个线程可以同时进行,分别处理10个子数组。
    个人认为,第二种情况效率会高。
      

  3.   

    如果不考虑先后次序的话那应该是第二个方法更高效吧!因为第一个方法同一时间只允许一个线程去处理。再加上线程的切换,效率是否不如第二个方法?
      

  4.   

    加锁是不得已而为之,如果多线程不用加锁就可以解决问题,当然是优先方案了。
      

  5.   

    如果第一个情况是互斥的,那就选第二个,其实第一个可以不互斥,每个线程操作不同的索引范围
      

  6.   

    如果不考虑先后次序的话那应该是第二个方法更高效吧!因为第一个方法同一时间只允许一个线程去处理。再加上线程的切换,效率是否不如第二个方法?在没有同步冲突的情况下, 分开处理相对简单, 效率主要取决于待处理对象的具体工作.类似上边的例子, 假设每个线程产生同步操作的点在占号环节, 那只是一个判断和标记工作, 和第二种的效率差别就不大.