CreateThread使用说明

函数原型:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  __drv_aliasesMem LPVOID lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

参数说明:

lpThreadAttributes

指向SECURITY_ATTRIBUTES 结构的指针,该结构确定子进程是否可以继承返回的句柄。如果 lpThreadAttributes为NULL,则无法继承句柄。

结构的lpSecurityDescriptor成员为新线程指定安全描述符。如果lpThreadAttributes为NULL,则线程获取默认安全描述符。

dwStackSize

线程堆栈的初始大小,以字节为单位。如果此参数为零,则新线程使用可执行文件的默认大小。

lpStartAddress

指向由线程执行的应用程序定义函数的指针。该指针表示线程的起始地址。

lpParameter

要传递给新建线程的命令行参数。

dwCreationFlags

控制线程创建的标志。

含义

0

该线程在创建后立即运行。

CREATE_SUSPENDED

0x00000004

线程是在挂起状态下创建的,并且在调用ResumeThread函数之前不会运行 。

STACK_SIZE_PARAM_IS_A_RESERVATION

0x00010000在

所述dwStackSize参数指定堆栈的初始保留大小。如果未指定此标志,则dwStackSize指定提交大小。

lpThreadId

指向新建线程的ID号。如果此参数为 NULL,则不返回线程标识符。

代码实例:

// CreateThread.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 

using namespace std;

DWORD WINAPI Fun1( LPVOID lpParam );
DWORD WINAPI Fun2( LPVOID lpParam ); //必须加参数,否则创建线程失败。提示无法将参数 3 从“DWORD (__stdcall *)(void)”转换为“LPTHREAD_START_ROUTINE”

int main()
{
    HANDLE h1 = CreateThread( NULL, 0, Fun1, NULL, 0, NULL );
    cout << "Thread1 create." << endl;

    HANDLE h2 = CreateThread( NULL, 0, Fun2, NULL, 0, NULL );
    cout << "Thread2 create." << endl;

    while( 1 )
    {
        if( getchar() == 'q' )
        {
            CloseHandle( h1 );//不会直接关闭线程,只是递减线程中的内核对象使用计数。当使用计数为0时,释放内核对象
            CloseHandle( h2 );
            return 0;
        }
        else
        {
            Sleep( 1000 );
        }
    }

    system( "pause" );
    return 0;
}

DWORD WINAPI Fun1( LPVOID lpParam )
{
    while( 1 )
    {
        cout << "Thread1 is running." << endl;
        Sleep( 900 ); //暂停当前线程,从等待的线程中执行
    }

    return 0;
}

DWORD WINAPI Fun2( LPVOID lpParam )
{
    while( 1 )
    {
        cout << "Thread2 is running." << endl;
        Sleep( 900 );
    }

    return 0;
}

结果说明:

运行后可知,线程的运行结果并没有按照代码的顺序而执行,这就涉及到后面的线程同步了。

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