美文网首页C语言C语言&嵌入式
C++开发这一步必不可少:C++创建线程的方法

C++开发这一步必不可少:C++创建线程的方法

作者: 洪荒少女_798b | 来源:发表于2020-01-02 19:59 被阅读0次

    c++开发过程中,创建线程是必不可少的,今天就给大家说说c++创建线程的方法,主要介绍我常用的2种方法。

    第一种:CreateThread

    HANDLE WINAPI CreateThread(

    LPSECURITY_ATTRIBUTES lpThreadAttributes,

    SIZE_T dwStackSize,

    LPTHREAD_START_ROUTINE lpStartAddress,

    LPVOID lpParameter,

    DWORD dwCreationFlags,

    LPDWORD lpThreadId);

    函数说明:

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

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

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

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

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

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

    函数返回值:成功返回新线程的句柄,失败返回NULL。

    第二种:_beginthreadex

    unsigned long _beginthreadex(

    void *security,

    unsigned stack_size,

    unsigned ( __stdcall *start_address )( void * ),

    void *arglist,

    unsigned initflag,

    unsigned *thrdaddr

    );

    第1个参数:安全属性,NULL为默认安全属性

    第2个参数:指定线程堆栈的大小。如果为0,则线程堆栈大小和创建它的线程的相同。一般用0

    第3个参数:指定线程函数的地址,也就是线程调用执行的函数地址(用函数名称即可,函数名称就表示地址)

    第4个参数:传递给线程的参数的指针,可以通过传入对象的指针,在线程函数中再转化为对应类的指针

    第5个参数:线程初始状态,0:立即运行;CREATE_SUSPEND:suspended(悬挂)

    第6个参数:用于记录线程ID的地址

    代码实例:

    CreateThread线程回调函数

    void ThreadFunc(LPVOID pParam)

    {

      printf("线程ID号为%4d的子线程说:Hello World\n", GetCurrentThreadId());

      return 0;

    }

    _beginthreadex 线程回调函数

    unsigned int __stdcall ThreadFun(PVOID pM)

    {

      printf("线程ID号为%4d的子线程说:Hello World\n", GetCurrentThreadId());

      return 0;

    }

    _beginthreadex 的回调函数还可以用函数指针的形式给出

    typedef unsigned(__stdcall *PTHREAD_START) (void *); //定义函数指针

    回调函数

    DWORD WINAPI CommProc(LPVOID lpParam)

    {

      printf("线程ID号为%4d的子线程说:Hello World\n", GetCurrentThreadId());

      return 0;

    }

    主函数

    int main()

    {

      ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc1, NULL, 0, NULL);

      _beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);

      //_beginthreadex如果用回调函数使用下面这条语句

      _beginthreadex(NULL, 0, (PTHREAD_START)CommProc, NULL, 0, NULL);

      return 0;

    }

    注:如果要使用线程,推荐使用_beginthreadex, 安全。

    -END-

    感谢观看!

    全球最大的C/C++人员聚集地就在我这里,企鹅裙馊号码:894479708  不管你是什么基础,来了就是兄弟,是兄弟就跟我一起学习C/C++!关注我,为编程点赞,每天学点小知识!C/C++的伙伴可以跟我学习,技术大牛、学习资料等助你早日成为一名优秀的程序员!

    如果你想要学好C++最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料.

    相关文章

      网友评论

        本文标题:C++开发这一步必不可少:C++创建线程的方法

        本文链接:https://www.haomeiwen.com/subject/chaooctx.html