zoukankan      html  css  js  c++  java
  • win32多线程程序设计笔记(第二章)

    第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点。


    一、创建线程                   


    与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主程序同时执行的程序来调用被封装的函数。

    HANDLE hThread = CreateThread (
                 LPSECURITY_ATTRIBUTES lpThreadAtt,
                 DWORD dwStackSize
                 LPTHREAD_START_ROUTINE lpFun,
                 LPVOID lpParameter,
                 DWORD dwCreationFlags,
                 LPDWORD lpThreadID)
        LpFun:就是指向被封装的函数的地址。
        LpParameter: 就是指向被封装的函数的参数(没有参数填入null)


    下图为简单的函数调用和调用线程的过程:



    注意当用CreateThread之后,产生的新的线程不会立即启动,执行的时间也是无法预期的


    二、核心对象                      


               当调用CreateThread()后,会产生线程核心对象(如果已经产生了线程核心对象,那么就只将此核心对象的引用计数加1;另外,win32系统中有若干种核心对象),并以句柄handle指向它。那么,显然,在线程使用完毕后就应该用CloseHandle()函数关闭。

    三、线程结束                      

              既然线程是独立的运行的程序,那么主程序如何知道线程执行完毕呢?
             答案是通过GetExitCodeThread(HANDLE hThread,LPDWORD lpExitCode)函数。如果线程已结束,那么线程结束的代码被放在lpExitCode参数中带回来,如果线程尚未结束,lpExitCode带回来的值是STILL_ACTIVE。

    例:
    DWORD WINAPI ThreadFun(LPVOID n) //线程函数:
    {
        return 10;
    }
    
    int main()
    {
        hThrd = CreateThread(null,0,ThreadFun, …);
        DWORD  exitCode=0;
        for(  ;  ; ) {
            GetExitCodeThread(hThrd,&exitCode);
            if ( exitCode == STILL_ACTIVE){
                       //线程仍然在运行
            }
            else{
                       break;
            }
        }
        //exitCode保存了函数的返回值
        printf( “线程函数的返回值 : %d /n”, exitCode);
        CloseHandle(hThrd);
        return 0;
    }
    


  • 相关阅读:
    Stream 常规操作
    Stream Introduction
    那些从阿里巴巴走出的创业牛人们
    码农转型传统行业更容易成功?
    创业者怎么讲故事打动投资人?
    李明远:移动互联网的创业时代
    想当年,那些抄我们试卷的坏分子,如今个个都当了老板.
    为什么说淘宝创业已难赚钱?
    让低版本IE支持Html5的新语义标签
    译文:TypeScript新手指南
  • 原文地址:https://www.cnblogs.com/riskyer/p/3313231.html
Copyright © 2011-2022 走看看