使用Windows的多线程函数,必须在程序中包含
线程的创建和终止
C++代码:
/***********************************************
//** NAME:多线程测试
//** USER:LZ
//** TIME:2017-10-19
/***********************************************/
#include
#include
using namespace std;
DWORD WINAPI PROCESST1(LPVOID param);
DWORD WINAPI PROCESST2(LPVOID param);
DWORD WINAPI PROCESST3(LPVOID param);
int main()
{
HANDLE Thread1,Thread2,Thread3;
Thread1=CreateThread(NULL,0,PROCESST1,NULL,0,NULL);
Thread2=CreateThread(NULL,0,PROCESST2,NULL,0,NULL);
Thread3=CreateThread(NULL,0,PROCESST3,NULL,0,NULL);
WaitForSingleObject(Thread1,INFINITE);
WaitForSingleObject(Thread2,INFINITE);
WaitForSingleObject(Thread3,INFINITE);
CloseHandle(Thread1);
CloseHandle(Thread2);
CloseHandle(Thread3);
return 0;
}
DWORD WINAPI PROCESST1(LPVOID param)
{
while(true)
{
cout<<"THE Thread1 IS working."<500);
}
return 0;
}
DWORD WINAPI PROCESST2(LPVOID param)
{
while(true)
{
cout<<"THE Thread2 IS working.."<500);
}
return 0;
}
DWORD WINAPI PROCESST3(LPVOID param)
{
while(true)
{
cout<<"THE Thread3 IS working..."<500);
}
return 0;
}
函数详解
CreateThread()函数原型:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES secAttr,
SIZE_T stackSize,
LPTHREAD_START_ROUTINE threadFunc,
LPVOID param,
DWORD flags,
LPDWORD threadID
);
函数说明:
1. 第一个参数secAttr是描述线程内核对象安全属性的指针,设置为NULL,就会使用默认的安全描述符。
2. 第二个参数stackSize表示线程栈空间大小。如果为0(1MB),那么这个线程堆栈的大小与创建它的线程相同。
3. 第三个参数threadFunc表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址,线程的执行一直持续到线程函数返回。
这个函数的地址在下面的函数中指定。每个线程函数都必须具有这样的原型:
DWORD WINAPI Thread1(LPVOID param);
-DWORD是数据类型,WINAPI是函数调用形式,返回32位数据的API函数。
- 需要传递给新线程的任何参数都在CreateThread()的param中指定。线程函数在它的参数中接收这个32位的值。这个参数可以用作任何目的。函数返回它的退出状态。
- WINAPI是一个宏,所代表的符号是__stdcall。windows API函数采用这种标准调用约定。
#define WINAPI __stdcall
stdcall的调用约定意味着:
1)参数从右向左压入堆栈;
2)函数自身修改堆栈;
3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸。
4.第四个参数param是传给线程函数的参数。
5.第五个参数flags标志了线程的执行状态,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED,线程则以挂起状态创建并等待执行,这样它就无法调度,直到调用ResumeThread()。
6.第六个参数threadid将以的长整型返回线程的ID号,传入NULL表示不需要返回该线程ID号。
函数原型:
BOOL CloseHandle( HANDLE hObject );
hObject 代表一个已打开的对象handle。如果成功,函数返回TRUE,失败返回FALSE,此时可以调用GetLastError()获知失败原因。
函数原型:
DWORD WaitForSingleObject(
HANDLE hObject,
DWORD dwMilliseconds
);
第一个参数hObject标识一个能够支持被通知/未通知的内核对象。
第二个参数dwMilliseconds为该线程为等待该对象变为已通知状态的等待时间。(INFINITE为无限时间量。INFINITE也可定义为0xFFFFFFFF或-1)