【多线程简单实例】CreateThread实现

来源:互联网 发布:怎么自己做软件 编辑:程序博客网 时间:2024/05/11 16:10
  • 使用Windows的多线程函数,必须在程序中包含<Windows.h>

    线程的创建和终止

    C++代码:

/***********************************************//**      NAME:多线程测试      //**      USER:LZ//**      TIME:2017-10-19/***********************************************/#include<iostream>#include<windows.h>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."<<endl;        Sleep(500);    }    return 0;}DWORD WINAPI PROCESST2(LPVOID param){    while(true)    {    cout<<"THE Thread2 IS working.."<<endl;    Sleep(500);    }    return 0;}DWORD WINAPI PROCESST3(LPVOID param){    while(true)    {      cout<<"THE Thread3 IS working..."<<endl;      Sleep(500);    }    return 0;}

函数详解

  • CreateThread()是一种微软在Windows API中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。如果成功,函数则向线程返回一个句柄。如果失败,则返回NULL。线程中止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象,否则,会在父进程结束时自动销毁它。
  • CreateThread()会导致内存泄漏,在其创建的线程中使用sprintf,malloc等涉及CRT存储堆操作的CRT库函数是不安全的。建议使用改进了的_beginthread()_beginthreadx()

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号。

  • Handle句柄类。可以理解为采用了引用计数的代理类,其多个句柄共享了同一个被代理的类.通过引用计数的方式来减少复制以及内存管理,其行为类似指针。
  • CloseThread()函数并不是把线程结束了,而是把线程句柄结束了. 线程执行完就会return,就当做一个函数执行完一样退出.在这里close的意思是, 主进程放弃对线程的控制了.
 函数原型: BOOL CloseHandle( HANDLE hObject ); 

hObject 代表一个已打开的对象handle。如果成功,函数返回TRUE,失败返回FALSE,此时可以调用GetLastError()获知失败原因。

  • WaitForSingleObject()等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。即在dwMilliseconds时间结束之前,调用的线程不应该变为可调度状态。
函数原型:DWORD WaitForSingleObject(HANDLE hObject,DWORD dwMilliseconds);

第一个参数hObject标识一个能够支持被通知/未通知的内核对象。
第二个参数dwMilliseconds为该线程为等待该对象变为已通知状态的等待时间。(INFINITE为无限时间量。INFINITE也可定义为0xFFFFFFFF或-1)

原创粉丝点击