基于windows的多线程编程初步介绍

基于windows的多线程编程
基于windows下的多线程编程,首先我们需要了解创建线程的函数CreateThread,CreateThread将在主线程的基础上创建一个新线程。

函数原型:
HANDLE CreateThread(LPSECURITY_ATTRIBUTElpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD Flags,LPDWORDlpThreadId)
参数说明:
参数1:指向SECURITY_ATTRIBUTES结构体的指针,一般设置该值为NULL,表示缺省的安全性。
参数2:指定初始提交栈的大小,以字节为单位。系统会将这个值向上四舍五入为系统页面大小的倍数。页面是操作系统在管理内存时,使用的一个内存单元。不同的cpu的页面大小是不同的,32位系统的页面大小为4KB。如果这个值是0或小于缺省提交的大小时,缺省将使用与调用该函数的线程相同的栈空间大小。
参数3:指针类型。指向LPTHREAD_START_ROUTINE类型的应用函数,表示了线程入口函数的地址。
参数4:指定传递给线程的参数。向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
参数5:线程标志。当 Flags == CREATE_SUSPENDED表示线程创建后处于暂停状态,直到ResumeThread函数调用才启动线程。若Flags==0,线程创建后立即运行。
参数6:参数6为输出参数,指向一个接受线程标识符的变量。当我们创建一个线程时,系统会为这个线程分配一个ID号。若不想返回线程ID,设置值为NULL。
返回值:函数成功,返回线程句柄;函数失败返回false。

对於单CPU系统,多线程的实现是利用时间片交替进行。
<span style="font-size:18px;">#include <iostream>   
#include <windows.h>   
using namespace std;   
 
DWORD WINAPI fun1Proc(LPVOID lpParam);
void main()
{
	HANDLE hThread1;
	hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
	CloseHandle(hThread1);
	cout<<"main thread is running\n";
	Sleep(100);

}
DWORD WINAPI fun1Proc(LPVOID lpParam)
{
	cout<<"the thread1 is running"<<endl;

	return 0;
}</span>

在主线程中使用CloseHandle函数关闭句柄,并没有终止新创建的线程。关闭句柄时,操作系统会递减新线程的线程内核对象的使用计数,当使用计数为0,系统会释放线程内核对象。如果在主线程当中,没有关闭句柄,始终会保留一个引用,这样线程内核对象的使用计数不为0,此时即使我们这个线程执行完毕,那么线程内核对象也不会被释放,直到等到进程终止时候,操作系统才会为残留对象做清理工作。

不同的线程对同一资源进行访问时候,会出现一些意想不到的错误,此时我们需要线程间的同步。线程间的同步就是保证一个线程在访问一种资源的时候,其他的线程在这个时间段之内不能够对这个资源进行访问。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章