轻量
和进程相比,系统在创建和管理线程时的开销要小的多,这里通过比较调用fork()创建进程和pthread_create()创建线程时的耗时开销来说明。下表中的耗时为执行了50000次创建操作对应的耗时,单位为秒。
注意:由于是在具有多核的对称系统上运行,不要期望系统空间耗时和用户空间耗时相加等于实际耗时,这个耗时数据充其量只是一份近似测量的结果。
高效的通信/数据交换
在支持高性能计算的平台上使用Pthreads可以实现性能的最优化,特别是当一个应用使用MPI进行进程间通信时,此时使用Pthreads代替MPI一般可以获得更高的性能。
MPI库一般通过共享内存实现进程间的通信,其中会包含至少一次的内存拷贝操作。而使用Pthreads时由于线程之间共享属于进程的资源,其中不存在数据拷贝,至多是一个指向数据的指针的传递。
最坏的情况下,使用Pthreads编程时可能会遇到缓存到CPU或者内存到CPU的带宽问题,但整体来说其速度仍然要比通过共享内存通信的MPI要快不少。
其他原因
使用多线程的应用程序相比不使用多线程的应用程序除了性能有所提升外,还具有如下优势:
- CPU可以与I/O操作同步进行;譬如一个应用程序中可能存在时间较长的I/O操作,此时一个线程可以等待该操作完成,而其他线程可以使用CPU继续执行相关任务,从而不被阻塞。
- 优先级/实时调度;更重要的任务可以被调度使其取代或打断低优先级的任务
- 异步事件处理:为不确定频率和耗时的事件提供服务的任务可以交错进行,譬如一个服务器可以一边按照前面接收到的请求传输数据,一边处理刚接收到的其他请求。
一个典型案例就是web浏览器,包含很多并行运行着的优先级不同的任务。另外现代操作系统中都会使用多线程技术,下图是Windows中任务管理器的截图,可以看到其中一些进程都包含了若干子线程。