基于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,此时即使我们这个线程执行完毕,那么线程内核对象也不会被释放,直到等到进程终止时候,操作系统才会为残留对象做清理工作。

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值