技术的乐趣在于分享,欢迎多多交流,多多沟通。
全部博文(877)
分类: Windows平台
2015-09-01 13:53:45
多线程程序在单核和多核上运行具有不同的特点。
锁:在单核上,多个线程执行锁或者临界区时,实际上只有一个线程在执行临界区代码,而核心也只支持一个线程执行,因此不存在冲突。如果某个线程持有锁,那么只是其他线程不会被调度到CPU上执行,影响的只是持有和释放锁的时间,处理器时刻在运行着。但是在多核上运行时,锁或临界区会导致其余处理器空闲而只允许一个处理器执行持有锁的那个线程,这是一个串行的过程,会影响性能。
负载均衡:在单核上不用考虑负载均衡,因为各个线程轮流执行,当一个线程执行完时,便会执行另一个线程,不存在线程等待问题。即使各个线程的任务非常不平衡,也不会影响总执行时间。而在多核上执行时,此时最终时间由运行时间最长的线程决定。
任务调度:单核上,任务调度完全是操作系统的工作,无须软件开发人员干预,通常有时间片轮转、优先级算法等。而在多核上运行时,软件开发人员要合理地在核心间分配任务,以尽量同时结束计算(此时任务调度的工作已经从操作系统转移到了软件开发人员)。
程序终止:在多线程环境中,何时终止程序就变得复杂,因为程序终止时需要确定各个线程都已经计算完成。幸运的是,多线程库通常都提供了对应的函数。在多机编程上,这个问题可能会变得非常复杂。