多线程好处多多,都列举出来就没有意思了,下面仅从一个方面来闲扯一下:
如果你熟悉VC++6.0或者BCB6.0, 你可以做这样一个实验:在按钮对应的方法中,让程序睡眠10秒钟,在这10秒钟之内,你无法移动窗体,也无法改变窗体大小,因为你用的是单线程呗。
书上,网上有不少地方在说多线程好,多线程有效率,有时候,你会发现一头雾水,下面,我来模拟用户界面线程和后台线程,旨在说明多线程为什么高效,程序如下:
#include <stdio.h> #include <time.h> #include <windows.h> // 模拟用户界面操作的耗时 void UserInput() { Sleep(5000); } // 后台线程入口 DWORD WINAPI Fun(LPVOID lpParameter) { int i, j; int sum = 0; for(i = 0; i < 30000; i++) { for(j = 0; j < 30000; j++) { sum++; } } printf("sum is %d\n", sum); return 0; } // 界面线程(主线程)入口 int main() { HANDLE h = CreateThread(NULL, 0, Fun, NULL, 0, NULL); int t1, t2; t1 = clock(); UserInput(); t2 = clock(); printf("total time is %d\n", t2 - t1); return 0; }
结果为:
sum is 900000000
total time is 5000
可见,用户操作后(用户操作时间为5s),立即可以看到结果,不用等。我们再来看看单线程下的情况:
#include <stdio.h> #include <time.h> #include <windows.h> void UserInput() { Sleep(5000); } void fun() { int i, j; int sum = 0; for(i = 0; i < 30000; i++) { for(j = 0; j < 30000; j++) { sum++; } } printf("sum is %d\n", sum); } int main() { int t1, t2; t1 = clock(); UserInput(); fun(); t2 = clock(); printf("total time is %d\n", t2 - t1); return 0; }
结果为:
sum is 900000000
total time is 8437
可见,单线程确实费时间。因为单线程让CPU有了更多的闲暇时间,效率自然就低了。
最后,我用一个非常通俗的例子结束本文:
假设一套数学练习试卷有10个题目,题目有难有易,如果第一个题目比较难,你傻傻地在那个地方死死地纠结,你很可能会卡住,此时老师又不在你身边,所以固执的你,一个题目也没有做出来,老师来了,发现你一个题目也没有做,你的效率自然就很低。这就是单线程模式,傻傻地直接往下做。如果采取多线程模式就好了,不会做,先跳过,先做容易的,等老师回来后,你再做难的,最根本的是要你处于忙碌状态,而不是死死地纠结在第一个问题上,那样,其实你没有在忙碌,你在浪费时间,效率自然就低。
人生又何尝没有夹杂着单线程模式和多线程模式?