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

  • 使用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()是一种微软在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)

你可能感兴趣的:(线程)