zoukankan      html  css  js  c++  java
  • 创建线程

    1.什么是线程?

    <1>线程是附属在进程上的执行实体,是代码的执行流程。

    <2>一个进程可以包含多个线程,但一个进程至少有一个线程

     
    MSDN中CreateThread原型:
    HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
    SIZE_T dwStackSize,//initialstacksize
    LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
    LPVOID lpParameter,//threadargument
    DWORD dwCreationFlags,//creationoption
    LPDWORD lpThreadId//threadidentifier
    )
     
       

    参数说明

    编辑
    lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE
    dwStackSize,设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长堆栈的大小。
    lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
    DWORD WINAPI 函数名 (LPVOID lpParam) ,格式不正确将无法调用成功。
    //也可以直接调用void类型
    //但lpStartAddress要这样通过LPTHREAD_START_ROUTINE转换如: (LPTHREAD_START_ROUTINE)MyVoid
    //然后在线程声明为:
    void MyVoid()
    {
    return;
    }
    lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
    dwCreationFlags :线程标志,可取值如下
    (1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,
    (2)0:表示创建后立即激活。
    (3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize参数指定初始的保留堆栈 的大小,否则,dwStackSize指定提交的大小。该标记值在Windows 2000/NT and Windows Me/98/95上不支持。
    lpThreadId:保存新线程的id。
    返回值:函数成功,返回线程句柄;函数失败返回false。若不想返回线程ID,设置值为NULL。
    函数说明:
    创建一个线程。
    语法:
    hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
    一般并不推荐使用 CreateThread函数,而推荐使用RTL库里的System单元中定义的 BeginThread函数,因为这除了能创建一个线程和一个入口函数以外,还增加了几项保护措施。
     
     

    CloseHandle(hThread);  关闭线程ID,并不会真正关闭线程,线程关闭的必要两个因素, 线程的索引全部为0,线程代码执行完毕;
    // 线程创建.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <windows.h>
    
    void WINAPI TextProc()
    {
        for (int i=0;i<100;i++)
        {
            Sleep(200);
            printf("++++++++++++++++++%d
    ", i);
        }
    }
    
    int main()
    {
        HANDLE hThread;
        hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TextProc, NULL, 0, NULL);
        CloseHandle(hThread);//并不会马上结束线程,计数器清零,还要等线程代码执行完毕后才能关闭;
        for (int i = 0; i < 100; i++)
        {
            Sleep(200);
            printf("++++++++++++++++++%d
    ", i);
        }
    
        return 0;
    }

    线程参数的使用

    DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {
        int* p = (int*)lpParameter;  //直接通过一个指针来获取参数地址
        for (int i = 0; i < *p; i++)
        {
            Sleep(200);
            printf("++++++++++++++++++%d
    ", i);
        }
    }
    int main()
    {
        HANDLE hThread;
        int n;
        n = 10; 
        hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID)&n, 0, NULL); //线程传递参数直接传递地址就行了,可以传任何类型的指针,结构体等等;
        CloseHandle(hThread);//并不会马上结束线程,计数器清零,还要等线程代码执行完毕后才能关闭;
        for (int i = 0; i < 100; i++)
        {
            Sleep(200);
            printf("++++++++++++++++++%d
    ", i);
        }
    
        return 0;
    }

    注意:线程参数的生命周期, 一点要保证,线程的参数一定要在线程运行完成后才能关闭,否则会出现丢失,这里最好使用全局变量

  • 相关阅读:
    UVA 125 Numbering Paths
    UVA 515 King
    UVA 558 Wormholes
    UVA 10801 Lift Hopping
    UVA 10896 Sending Email
    SGU 488 Dales and Hills
    HDU 3397 Sequence operation
    数据库管理工具navicat的使用
    javascript封装animate动画
    关于webpack没有全局安装下的启动命令
  • 原文地址:https://www.cnblogs.com/hanhandaren/p/11138613.html
Copyright © 2011-2022 走看看