进程与线程学习(三)之线程之使用场合
来源:互联网 发布:电脑下象棋软件 编辑:程序博客网 时间: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在并行数据处理方面的问题,现阶段是否有一种方法或机制来解决强关联数据的并行运算问题呢?
- 进程与线程学习(三)之线程之使用场合
- Linux进程与线程之三
- Android开发学习之进程与线程
- 现代操作系统学习之进程与线程
- 【os学习】之 进程(Process)与线程(Thread)
- 操作系统进程与线程之线程篇
- Android学习之线程&进程
- Linux 学习之进程、线程
- android之进程与线程
- Android之进程与线程
- linux之 线程与进程
- 操作系统之进程与线程
- Python 之 线程与进程
- 老生常谈之线程与进程
- Java之进程与线程
- Java之进程与线程
- 线程学习之三_线程结束
- 操作系统进程与线程之进程篇
- XP/Linux双系统下如何卸载Linux(实践总结)
- centos 在服务中新增单个服务
- 链表
- linux test命令
- javaSE 2.1 简单四则运算测试
- 进程与线程学习(三)之线程之使用场合
- 抄录c#
- 新手学LINUX下C++编程之路(一)
- 在排序数组中查找和为给定值的两个数字
- 期待已久的2012年度最佳 jQuery 插件揭晓
- CFileDialog的用法简介 .
- dbvis9破解,开启智能提示
- 格式与文件扩展名指定的格式不一致
- 从YH项目看软件开发过程