资源描述:
《vc++里使用信号量实现线程同步与互斥》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一、在vc里实现线程同步与互斥运行,你需要对一下几个函数进行研究学习与掌握使用:1、CreateThread()//创建线程的函数2、CreateSemaphore()//创建信号量的函数3、WaitForSingleObject()//4、ReleaseSemaphore()//*相关函数有:CreateProcess()//创建进程的函数Beginthread()//创建线程的函数OpenSemaphore()WaitForMultipleObjects()(有兴趣者可以对相关函数进行研究学习)二、第一步:你需要首先学会在vc里创建线程1、这里提供创建线程的函数是:C
2、reateThread()函数的原型是:HANDLECreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes,//SD SIZE_TdwStackSize,//initialstacksize LPTHREAD_START_ROUTINElpStartAddress,//threadfunction LPVOIDlpParameter,//threadargument DWORDdwCreationFlags,//creationoption LPDWORDlpThreadId//threadidentifier);函数说
3、明: 创建一个线程,线程指定要执行的函数或者代码块。函数有六个参数,要理解六个参数分别是干什么用的。下面说明参数的使用:参数1:lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows98中忽略该参数。在WindowsNT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE,一般是NULL。参数2:dwStackSize,设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据
4、需要动态延长堆栈的大小。参数3:lpStartAddress,指向线程函数的指针,即函数入口。形式:@函数名,函数名称没有限制,但是必须以下列形式声明:5DWORDWINAPI函数名(LPVOIDlpParam),格式不正确将无法调用成功。比如一下程序1中的函数fun1可以这有定义:DWORDWINAPIFun1(LPVOIDIpParameter);//有点麻烦调用的时候是:hThread1=CreateThread(NULL,0,Fun1,NULL,0,NULL);但是这有写函数有点不习惯,有点麻烦,所以可以这么来定义函数:voidfun1();,但是调用的时候要这么
5、写:CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Fun1,NULL,0,NULL);//也就是lpStartAddress要这样通过LPTHREAD_START_ROUTINE转换。参数4:lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。比如:你要向函数fun1传递一个字符串,可以这么来写程序:程序如下:#include#include#include#include#include
6、voidFun1(LPVOIDp);voidmain(){HANDLEhThread1;char*a="hellofun1!";hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Fun1,a,0,NULL);getch();CloseHandle(hThread1);}voidFun1(LPVOIDp){printf("%s",(char*)p);}向控制台打印:参数5:dwCreationFlags:线程标志,可取值如下(1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,注:传0
7、x00000004(2)0:表示创建后立即激活。(3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize参数指定初始的保留堆栈的大小,否则,dwStackSize指定提交的大小。该标记值在Windows2000/NTand5WindowsMe/98/95上不支持。参数6:lpThreadId:保存新线程的id。(各参数说明完毕,注:参数说明来自百度文档)函数返回值:函数成功,返回线程句柄;函数失败返回false。若不想返回线程ID,设置值为NULL。到这你会在vc