VC++深入详解——第15章:多线程,进程,线程
2015-08-17 21:39
316 查看
1. 进程:
(1)程序与进程
程序是计算机指令的集合,文件形式存储在计算机磁盘上。
进程是程序执行的一个实例,是一个程序在其地址空间的一次执行活动。
一个程序可以对应着多个进程。
进程是资源申请,调度看,独立运行的单位。
(2)进程的组成:
内核对象:系统用来存放进程的相关统计信息的地方,是操作系统内部分配的一个内存块。
地址空间:包含所有可执行模块或DLL模块的代码和数据,还包含动态分配的内存空间,线程的栈和堆分配的空间。
(3)进程不执行任何程序,进程只是线程的容器,是线程执行程序的环境。
每个进程都有自己独立的地址空间。
2. 线程:
(1)线程的组成:
线程的内核对象:操作系统用它来管理线程
线程栈(stack):用于维护线程在知心函数时所需的函数参数和局部变量。
系统从进程的地址空间中分配内存,供线程栈使用。
线程只有一个内核对象和栈,所需的内存空间少。
(2)线程的运行
系统为每一个线程安排时间片,循环的运行每个线程的时间片,同一时间其实只有一个线程在运行,但是时间片很短,所以
多个线程看起来感觉像在同时运行一样。
为啥一般采用多线程而不用多进程:
(1)所占的空间资源:对于进程的创建来说,系统要为其创建4GB的地址空间,耗费的资源比较多,而线程只是在进程的地址
空间中创建,可以共享一个地址空间。
(2)进程间切换需要交换整个地址空间,而线程间切换只需要改变执行环境,效率更高
(3)线程间通信比进程间通信效率更高。
15.2 线程创建函数:CreateThread()
function CreateThread(
lpThreadAttributes: Pointer; {安全设置}
dwStackSize: DWORD; {堆栈大小}
lpStartAddress: TFNThreadStartRoutine; {入口函数}
lpParameter: Pointer; {函数参数}
dwCreationFlags: DWORD; {启动选项}
var lpThreadId: DWORD {输出线程 ID }
): THandle; stdcall; {返回线程句柄}
void Sleep(DWORD dwMilliseconds);
参数为:时间,以ms为单位。将线程挂起
CloseHandle(handle)
关闭线程句柄,只是关闭线程的内核对象引用计数,并不是终止线程的运行。
15.3 简单的多线程实例
(1)程序与进程
程序是计算机指令的集合,文件形式存储在计算机磁盘上。
进程是程序执行的一个实例,是一个程序在其地址空间的一次执行活动。
一个程序可以对应着多个进程。
进程是资源申请,调度看,独立运行的单位。
(2)进程的组成:
内核对象:系统用来存放进程的相关统计信息的地方,是操作系统内部分配的一个内存块。
地址空间:包含所有可执行模块或DLL模块的代码和数据,还包含动态分配的内存空间,线程的栈和堆分配的空间。
(3)进程不执行任何程序,进程只是线程的容器,是线程执行程序的环境。
每个进程都有自己独立的地址空间。
2. 线程:
(1)线程的组成:
线程的内核对象:操作系统用它来管理线程
线程栈(stack):用于维护线程在知心函数时所需的函数参数和局部变量。
系统从进程的地址空间中分配内存,供线程栈使用。
线程只有一个内核对象和栈,所需的内存空间少。
(2)线程的运行
系统为每一个线程安排时间片,循环的运行每个线程的时间片,同一时间其实只有一个线程在运行,但是时间片很短,所以
多个线程看起来感觉像在同时运行一样。
为啥一般采用多线程而不用多进程:
(1)所占的空间资源:对于进程的创建来说,系统要为其创建4GB的地址空间,耗费的资源比较多,而线程只是在进程的地址
空间中创建,可以共享一个地址空间。
(2)进程间切换需要交换整个地址空间,而线程间切换只需要改变执行环境,效率更高
(3)线程间通信比进程间通信效率更高。
15.2 线程创建函数:CreateThread()
function CreateThread(
lpThreadAttributes: Pointer; {安全设置}
dwStackSize: DWORD; {堆栈大小}
lpStartAddress: TFNThreadStartRoutine; {入口函数}
lpParameter: Pointer; {函数参数}
dwCreationFlags: DWORD; {启动选项}
var lpThreadId: DWORD {输出线程 ID }
): THandle; stdcall; {返回线程句柄}
void Sleep(DWORD dwMilliseconds);
参数为:时间,以ms为单位。将线程挂起
CloseHandle(handle)
关闭线程句柄,只是关闭线程的内核对象引用计数,并不是终止线程的运行。
15.3 简单的多线程实例
#include<Windows.h> #include<iostream> using namespace std; //线程回调函数Func1proc DWORD WINAPI Func1proc(LPVOID lpparameter); int index=0; int main() { HANDLE hThread1; hThread1=CreateThread(NULL,0,Func1proc,NULL,0,NULL); //这里调用closehandle并没有终止线程的运行,只是关闭了线程的句柄 //主函数对其不能引用,内核对象的引用计数减一。 CloseHandle(hThread1); while (index++<10) cout<<"main thread is running"<<endl; system("pause"); } DWORD WINAPI Func1proc(LPVOID lpparameter) { cout<<"thread1 is running"<<endl; return 0; }
相关文章推荐
- 约瑟夫问题
- LeetCode (8) String to Integer (atoi) C语言程序
- C语言编程需要注意的64位和32机器的区别
- 一起talk C栗子吧(第三十七回:C语言实例--获取当前日期和时间)
- 经典C语言程序设计100例
- C语言-6
- UE4学习笔记(二):c++与蓝图的交互
- 黑马程序员-[OC语言] 第八篇:foundation框架之 NSFileManager、NSDate概述
- 使用C++ 11 实现阻塞队列
- HDOJ1085母函数的应用
- Effective C++ 条款2 尽量以const,enum,inline替换#define
- 黑马程序员-[OC语言] 第六篇:foundation框架之 NSString 基本用法
- 黑马程序员-[OC语言] 第四篇:ARC机制、类别 概述
- (C++ 11) 泛型算法(一)
- 黑马程序员-[OC语言] 第三篇:MRC手动内存管理总结
- C++ Read a whole File using ifstream
- 黑马程序员-[OC语言] 第二篇:继承、多态概述
- 线性表(顺序存储)C语言实现
- c/c++编译时,指定程序运行时查找的动态链接库路径
- 黑马程序员-[OC语言] 第一篇:类、对象的基本概述