• 创建线程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;
    }
    
  • 相关阅读:
    单调栈
    P1164 小A点菜
    P1156 垃圾陷阱
    P1140 相似基因
    P1136 迎接仪式
    P1133 教主的花园
    P1131 [ZJOI2007]时态同步
    P1130 红牌
    利用SQLite在android上实现增删改查
    利用SQLite在android上创建数据库
  • 原文地址:https://www.cnblogs.com/lixuejian/p/12965783.html
Copyright © 2020-2023  润新知