第八节 多线程基本知识
一、基本概念
1.进程
程序: 程序是计算机指令的集合,它以文件的形式存储在磁盘上。
进程: 通常被定义为一个正在运行的程序的实例,是一个程序在其
自身的地址空间中的一次执行活动。
2、进程组成
内核对象:内核对象是操作系统内部分配的一个内存块,该内存块
是一种数据结构,其成员负责维护该对象的各种信息。
地址空间:包含所有可执行模块或者DLL模块的代码和数据。还包含
动态内存分配的空间。
3、进程地址空间
系统赋予每个进程独立的虚拟地址空间。
4、线程的组成
内核对象: 操作系统用它来对线程实施管理。内核对象也是系统
用来存放线程统计信息的地方。
线程栈 : 它用于维护线程在执行代码时需要的所有函数参数和
局部变量。
二、线程创建函数
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, 这里可用为其传递NULL,
让该线程使用默认的安全性。
DWORD dwStackSize, 设置线程初始栈的大小,即线程
可将多少地址空间用于自己的栈,
以自己为单位。
LPTHREAD_START_ROUTINE lpStartAddress, 函数将由新线程执行,表明新线程的
起始地址。新线程的执行函数地址。
函数形式如下:
DWORD WINAPI ThreadProc(LPVOID lpParameter);
LPVOID lpParameter, 可用接收命令行参数,可用通过这个参数给
创建的新线程传递参数。
DWORD dwCreationFlags, 设置用于控制线程创建的附加标记。
0:表示线程创建后立即运行。
LPDWORD lpThreadId); 返回线程ID。
三、简单多线程示例
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1proc,NULL,0,NULL);
CloseHandle(hThread1); 子线程并没有结束,只是让引用计数器减1,
目的让线程结束时自动关闭。
反之,不能自动关闭。
cout<<"main thread is running"<<endl;
Sleep(10); 给子线程运行的机会。如果没有,
主线程一直运行。最后退出main
则结束进程。子线程不无运行机会。
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
cout<<"thread1 is running"<<endl;
return 0;
}
四、线程的同步
1、互斥对象: 它能够确保线程拥有对单个资源的互斥访问权。
HANDLE CreateMutex( 返回所创建的互斥对象的句柄。
LPSECURITY_ATTRIBUTES lpMutexAttributes, 可以给该此案数传递NULL值,
让互斥对象使用默认的安全性。
BOOL bInitialOwner, 指定互斥对象初始化的拥有者,
如果为真,则创建这个互斥对象
的线程获得该对象的所有权。
否则,该线程将不获得所创建的
互斥对象的所有权。
LPCTSTR lpName); 指定互斥对象的名称。如果此参
数为NULL,则创建一个匿名的互
斥对象。
BOOL ReleaseMutex(HANDLE hMutex); 该函数将释放指定对象的所有权。
请求共享对象的使用权来获得所有权。
DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
hHandle: 所请求的对象的句柄。
dwMilliseconds: 指定等待的时间间隔,以毫秒为单位。
如果指定的时间间隔已过,函数也返回。
转载于:https://blog.51cto.com/rosehacker/449227