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;
    }
    


  • 相关阅读:
    shell脚本根据端口号kill掉进程
    使用netstat -ano 查看机器端口的占用情况(windows环境)
    分享一两个小工具,
    将压缩文件伪装图片格式文件以及将python文件转化为exe文件(测试完,真的有效)
    celery 异步任务 周期任务 定时任务的实现
    wsgi、uwsgi、asgi协议的关系
    centos7忘记密码更改步骤
    工作遇到的坑以及自己的学习悟道之道
    案例小集锦
    asp.net mvc部署
  • 原文地址:https://www.cnblogs.com/riskyer/p/3313231.html
Copyright © 2011-2022 走看看