您的位置:首页 > 编程语言 > C语言/C++

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 简单的多线程实例

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: