多线程编程时现代软件技术中很重要的一个环节。弄懂多线程,就要牵涉到多进程吗?当然,要了解到多进程,就要涉及到操作系统。
(1)单CPU下的多线程
在没有出现多核CPU之前,我们的计算资源是唯一的。如果系统中有多个任务要处理的话,那么就需要按照某种规则以此调度这些任务进行处理。什么规则呢?可以使一些简单的调度方法,比如说
- 1>按照优先级调度
- 2>按照FIFO调度
- 3>按照时间片调度等等
当然,除了CPU资源外,系统中还有一些其他的资源需要共享,比如说,内存、文件、端口、socket等。既然系统中的资源是有限的,那么获取这些资源的最小单位是什么呢,其实就是进程。
(2)多核CPU下的多线程
没有出现多核之前,我们的CPU实际上是按照某种规则对线程进行依次调度的。在某一个特定的时刻,CPU的执行还是在某个特定的线程上。然而,现在有多核CPU,一切变得不一样了,因为在某一时刻很有可能确实是n个任务n个核上运行。我们可以编写一个demo进行测试,如果是一个核,运行的语句就应该是一样的。
#include <Windows.h>
#include <iostream>
#define MAX_VALUE 10000000
double TestFun(int para)
{
double result=0.0;
for(int index = para + 1; index < MAX_VALUE; index +=2 )
result += 1.0 / index;
return result;
}
void main()
{
int time1=0,time2=0;
double value1=0.0,value2=0.0;
time1 = GetTickCount();
for(int index = 1; index < MAX_VALUE; index ++)
value1 += 1.0 / index;
time1 = GetTickCount() - time1;
time2 = GetTickCount();
value2 = TestFun(0)+TestFun(1);
time2 = GetTickCount() - time2;
printf("time1 = %d,time2 = %d\n",time1,time2);
system("pause");
return;
}
(3)多线程编程
为什么要多线程编程呢?这其中的原因很多,我们可以举例解决
- 1>有的是为了提高运行的速度,比如多核CPU下的多线程
- 2>有的是为了提高资源的利用率,比如在网络环境下下载资源时,时延常常很高,我们可以通过不同的thread从不同的地方获取资源,这样就可以提高效率了
- 3>有的是为了提供更好的服务,比如说服务器
- 4>其他需要多线程编程的地方等等