为什么要使用多线程?(无代码,无真相)

972 篇文章 329 订阅
32 篇文章 6 订阅

       多线程好处多多,都列举出来就没有意思了,下面仅从一个方面来闲扯一下:

       如果你熟悉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个题目,题目有难有易,如果第一个题目比较难,你傻傻地在那个地方死死地纠结,你很可能会卡住,此时老师又不在你身边,所以固执的你,一个题目也没有做出来,老师来了,发现你一个题目也没有做,你的效率自然就很低。这就是单线程模式,傻傻地直接往下做。如果采取多线程模式就好了,不会做,先跳过,先做容易的,等老师回来后,你再做难的,最根本的是要你处于忙碌状态,而不是死死地纠结在第一个问题上,那样,其实你没有在忙碌,你在浪费时间,效率自然就低。

       人生又何尝没有夹杂着单线程模式和多线程模式?



 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值