创建线程CreateThread

修改说明:

CreateThread()来创建线程其实是一种不太好的方法,在实际使用中尽量使用_beginthreade()来创建线程,因为更加的安全

函数的原型:

HANDLE WINAPI CreateThread(
  _In_opt_  LPSECURITY_ATTRIBUTES  lpThreadAttributes,  
  _In_      SIZE_T                 dwStackSize,
  _In_      LPTHREAD_START_ROUTINE lpStartAddress,
  _In_opt_  LPVOID                 lpParameter,
  _In_      DWORD                  dwCreationFlags,
  _Out_opt_ LPDWORD                lpThreadId
);

参数说明:

第一个参数 lpThreadAttributes 表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。

第二个参数 dwStackSize 表示线程栈空间大小。传入0表示使用默认大小(1MB)。

第三个参数 lpStartAddress 表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。

第四个参数 lpParameter 是传给线程函数的参数。

第五个参数 dwCreationFlags 指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。

第六个参数 lpThreadId 将返回线程的ID号,传入NULL表示不需要返回该线程ID号。

返回值

CreateThread的返回值是线程的句柄,失败的话就返回NULL

实例1:

/* 创建第一个线程。主进程结束,则撤销线程。 */
 
#include<Windows.h>
#include<stdio.h>
 
DWORD WINAPI ThreadFunc(LPVOID);
 
void main()
{
    HANDLE hThread;
    DWORD  threadId;
 
    hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &threadId); // 创建线程
    printf("我是主线程, pid = %d
", GetCurrentThreadId());  //输出主线程pid
    Sleep(2000);
}
 
DWORD WINAPI ThreadFunc(LPVOID p)
{  
    printf("我是子线程, pid = %d
", GetCurrentThreadId());   //输出子线程pid
    return 0;
}

实例2:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <process.h>
 
//typedef unsigned long       DWORD;
//#define WINAPI      __stdcall  标准的呼叫;
//typedef void far            *LPVOID;
 
DWORD WINAPI mymsg(LPVOID lp)
{
    MessageBoxA(0,"Hello China","Welcome!",0);
    return 0;
}
 
 
int main(void)
{
    //顺序执行
    //MessageBoxA(0,"Hello China","Welcome!",0);
    //MessageBoxA(0,"Hello China","Welcome!",0);
    //MessageBoxA(0,"Hello China","Welcome!",0);
    //MessageBoxA(0,"Hello China","Welcome!",0);
 
    //_beginthread(); //以前依赖的是_beginthread进行多线程执行;
 
 
 
    int i;
    HANDLE hthread;
    DWORD threadid;//保存进程的编号;
 
 
    for (i = 0; i <5; i++)
    {
        hthread = CreateThread(
            NULL,//表示线程内核对象的安全属性;
            NULL,//表示线程堆栈空间的大小;
            mymsg,//表示新线程所执行的线程函数地址;
            NULL,//函数的参数;
            0,//立刻执行;
            &threadid//将返回线程的ID号;
            );
 
        //单线程的等待;
        //INFINITE //超时等待,等待上一步执行完毕才继续执行;
        //IGNORE   //忽略等待,直接启用线程;
 
 
        WaitForSingleObject(hthread,INFINITE);
        CloseHandle(hthread);//关闭一个线程;
    }
 
 
    //mymsg(NULL);
    //CreateThread()
 
 
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/lixuejian/p/12965783.html