程序和进程
**程序:**计算机指令的集合,以文件形式存储在磁盘上。
**进程:**一个正在运行的程序的实例,是程序在其自身的地址空间中的一次执行活动。多次执行,代表多个进程。
**进程的组成:**内核对象和地址空间。内核对象是系统用来存放关于进程 统计 信息的地方,是一个内存块,由操作系统分配,是一种数据结构,简单说负责维护进程。地址空间包含所有可执行的模块和DLL模块的代码和数据,包含动态分配的内存空间。
线程
真正完成代码执行的是线程,进程是线程运行的环境,或者说是线程的容器。
线程的组成:
**内核对象,**维护线程。
**线程栈,**维护线程执行过程中所有函数参数和局部变量。
**线程的运行:**宏观上看好像是同时运行,微观上系统为每个线程分配一个时间片。在 多CPU的机器上,可以实现线程真正的同时执行。
Windows 创建线程的函数CreateThread,其原型:
HANDLE CreateTreah
(
LPSECURITY_ATTRIIBUTES lpThread,//安全属性,默认NULL
DWORD dwStackSize,//线程栈大小KB
LPTHREAD_START_ROUTINE lpStartAddress,//线程函数起始地址
LPVOID lpParameter,//命令行参数
DWORD dwCreateionFlags,//创建标志(是否创建后运行)
LPDWORD lpThreadId//线程ID
);
单线程例子:
#include<Windows.h>
#include<iostream>
using namespace std;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int index = 0;
void main()
{
HANDLE hTread1;
hTread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
CloseHandle(hTread1);
cout << "Main thread runing\n";
Sleep(10);
};
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
cout << "Thread1 is running\n";
return 0;
}
**互斥量:**对于多线程,使用一个资源,该将资源声明为互斥量。互斥量由一个线程占用资源,只有将资源释放后,才能由其他进程使用。
多线程例子(火车站卖票,两个线程一起卖票):
#include<windows.h>
#include<iostream>
using namespace std;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int index = 0;
int tickets = 1000;
HANDLE hMutex;
void main()
{
HANDLE hTread1;
HANDLE hTread2;
hTread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
hTread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);
CloseHandle(hTread1);
CloseHandle(hTread2);
hMutex = CreateMutex(NULL, FALSE, NULL);
Sleep(4000);
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex, INFINITE);
if (tickets > 0)
{
cout << "1 sell ticket:" << tickets-- << endl;
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex, INFINITE);
if (tickets > 0)
{
cout << "2 sell ticket:" << tickets-- << endl;
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
注意:DWORD其实就是 unsigned long int 类型,HANDLE其实就是 void* 。WINAPI 其实就是_stdcall。无非是换个名称而已。