进程与线程学习(三)之线程之使用场合

来源:互联网 发布:电脑下象棋软件 编辑:程序博客网 时间:2024/06/05 00:08

在对进程、线程的学习稍加了解后,不仅会自问在什么情况下要使用多线程?毕竟,对知识的学习而不在于知识本身,而是怎么使用所学的知识,有什么局限性。

但从耗时来讲,我对多线程做了一些测试:程序如下:

只有一个主线程来估计买票时间;

#include "stdafx.h"#include "windows.h"#include "iostream"using namespace std;void func(); int ticket=500;int starttime=GetTickCount();void main(){     //SetProcessAffinityMask(GetCurrentProcess(),2);//这个语句可以控制CPU的使用 func();     }void func(){    while(TRUE)      {           if(ticket>0) cout<<"func sale the ticket id is:"<<ticket--<<endl;           else   {     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;                 break;   }      }}
采用双线程的程序:

#include "stdafx.h"#include "windows.h"#include "iostream"using namespace std;DWORD WINAPI ThreadProc1(LPVOID lpParameter);void func(); int ticket=500;int starttime=GetTickCount(); void main(){ //SetProcessAffinityMask(GetCurrentProcess(),2); //设定运行的CPU      HANDLE handle1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);      CloseHandle(handle1);    Sleep(40000);} DWORD WINAPI ThreadProc1(LPVOID lpParameter){      //说明:在线程的时间片内持续运行      while(TRUE)      {           if(ticket>0) cout<<"thread1 sale the ticket id is:"<<ticket--<<endl;           else   {     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;                 break;   }      }      return 0;}
采用三(四)线程的程序

// thread_ticketsselling.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "windows.h"#include "iostream"using namespace std;DWORD WINAPI ThreadProc1(LPVOID lpParameter);DWORD WINAPI ThreadProc2(LPVOID lpParameter);DWORD WINAPI ThreadProc3(LPVOID lpParameter); int ticket=500;int starttime=GetTickCount(); void main(){  //SetProcessAffinityMask(GetCurrentProcess(),2); //设定运行的CPU      HANDLE handle1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);      HANDLE handle2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);  HANDLE handle3=CreateThread(NULL,0,ThreadProc3,NULL,0,NULL);      CloseHandle(handle1);      CloseHandle(handle2);  CloseHandle(handle3);   /*说明:为了使得主线程在退出之前保证副进程的执行完成,有些实现方法是采用恒真的空循环,单此种方法主线程会占用cpu的运行时间,如果采用Sleep,则主线程完全不占用cpu的任何运行时间*/  //cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;Sleep(40000);  //getchar();//VS2008} DWORD WINAPI ThreadProc1(LPVOID lpParameter){      //说明:在线程的时间片内持续运行      while(TRUE)      {           if(ticket>0) cout<<"thread1 sale the ticket id is:"<<ticket--<<endl;           else   {     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;                 break;   }      }      return 0;}DWORD WINAPI ThreadProc2(LPVOID lpParameter){      while(TRUE)      {           if(ticket>0) cout<<"thread2 sale the ticket id is:"<<ticket--<<endl;           else   {     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;                 break;   }      }      return 0;}DWORD WINAPI ThreadProc3(LPVOID lpParameter){      //说明:在线程的时间片内持续运行      while(TRUE)      {           if(ticket>0) cout<<"thread3 sale the ticket id is:"<<ticket--<<endl;           else   {     cout<<"The total time used is :"<<endl<<GetTickCount()-starttime<<endl;                 break;   }      }      return 0;}
各个线程的耗时汇总如下:


从这个测试来看,并不是所有的程序都适合多线程的,但是多核CPU的使用效果还是非常明显的。那么什么情况下使用多线程呢?

显然的是:多线程的使用要比多进程更节约CPU资源和时间。

多线程的情况下,CPU还要花时间去维护,CPU处理各线程的请求时在线程间的切换以及对线程的管理也要花时间,所以一般情况下是可以不用多线程的,用了有时反而会得不偿失。

大多情况下,要用到多线程的主要是

A、耗时或大量占用处理器的任务,阻塞用户界面操作。

B、各个任务必须等待外部资源(如远程文件或 Internet连接)。

比如:读写文件、视频图像的采集、处理、显示、保存等。

后记:

这里就存在疑问了?在多核下,对多线程的处理可以看成是并行的,如果线程间的数据及变量是相互独立的,那么情况就变得简单,问题是如果线程的数据及变量是相关联的,那么计算机是怎么解决这个问题的呢,这个时候的数据处理可不可以看成是并行的呢?正如Hadoop在并行数据处理方面的问题,现阶段是否有一种方法或机制来解决强关联数据的并行运算问题呢?



原创粉丝点击