Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78535
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-25 14:06
文章分类
文章存档

2013年(13)

我的朋友

分类: C/C++

2013-07-30 09:08:03

一、多线程的实例分析

在linux下实现多线程必须要包括头文件pthread.h,在Windows下的VC下实现多线程并没有pthread.h,所以必须手动添加库文件和头文件并配置,需要的是下面的附件:
pthreads-w32-2-8-0-release.zip
解压之后extract到相应的lib和include下面去,然后再配置好就可以使用了。

下面见一个在VC下面运行的一个多线程的例子,代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>


  4. void *tprocess1(void *args)
  5. {
  6.     int i = 1;
  7.     
  8.     while(i <= 10)
  9.     {
  10.         printf("process1 : %d\n",i);
  11.         i++;
  12.     }
  13.     return NULL;
  14. }

  15. void *tprocess2(void *args)
  16. {
  17.     int i = 1;
  18.     
  19.     while(i <= 10)
  20.     {
  21.         printf("process2 : %d\n",i);
  22.         i++;
  23.     }
  24.     return NULL;
  25. }



  26. int main(void)
  27. {
  28.     pthread_t t1;
  29.     pthread_t t2;
  30.     pthread_create(&t1,NULL,tprocess1,NULL);
  31.     pthread_create(&t2,NULL,tprocess2,NULL);
  32.     pthread_join(t1,NULL);
  33.     pthread_join(t2,NULL);

  34.     return 0;
  35. }
运行之后会发现代码的结果不唯一,也就是说答案是不确定的,为什么呢?这是两个线程争夺CPU资源的结果。

二、多线程的用处和好处

CPU是以时间片的方式为进程分配CPU处理时间的,当一个进程以同步的方式去完成几件事情时,此进程必须完成了第一件事情以后再做第二件事,如此按顺序的向CPU请求完成要做的事情。在单线程的工作环境中,如果要把CPU看作是一共有100个时间片的话,CPU可能一直都只是花了其中10个时间片来处理当前进程所要做的工作,只是用到了CPU的10%的时间片,而其他的时间片当然是白白的浪费了,当然,实际上CPU的工作模式还是做完一件事以后再去做另一件事,只是CPU的处理速度非常快,很快就处理完成所请求的事情。

为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而互不干扰,如当前进程要完成三件事情1,2,3,那么CPU会分别用10%的时间来同时处理这三件事情,从而让CPU的使用率达到了30%,大大地提高了CPU的利用率。多线程的好处在处理一些特殊的场合其优势尤其明显。比如下载文件,你要一边下载一边显示进度一边保存,在这种情况下,如果没有用多线程的话,没有意外的话一般都会把主线程阻塞,比如进度条的进度没有随着已下载的量而变化,甚至是整个窗口都不能动了,用多线程就可以很好的解决这个问题。

这里有一个生活实例可以更好地去理解多线程:回家看你媳妇在做饭,正常的话都会把洗好的菜和肉先放到锅里煮,然后一边洗别的菜或者处理比的事情,如:洗碗,收拾桌子准备开饭,人还是一个人,但是是她同时做了几件事情,这样就可以大大地提高效率。总的一句话就是:CPU还是要花同样多的时间去完成所有的事情,但是多线程可以让CPU参插的同时做很多事情,在视觉上让用户觉得计算机在同时帮他处理多件事情,更好的改善用户体验。

了解了多线程的好处之后,就要了解应该在什么样的情况下使用多线程技术。因为并不是所有情况下用多线程都是好事,因为多线程的情况下,CPU要花费时间去维护,CPU处理各线程的请求在线程间的切换是要花费时间的,所以一般情况下是可以不用多线程的,用了有时候会反而会得不偿失。大多数情况下,要用到多线程的主要是需要处理大量的IO操作或者处理的情况需要花大量的时间等等,比如读写文件,视频图像的采集,处理显示保存等。
阅读(4244) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~