zoukankan      html  css  js  c++  java
  • 线程中常用函数及参数

    1._beginthread()

    假如成功,函数将会返回一个新线程的句柄(HANDLE是void *类型)

    HANDLE hd =_beginthread(CheckKey, 0, NULL)

    • 新线程的起始地址 ,指向新线程调用的函数的起始地址
    • 新线程的栈大小,可以为0
    • 传递给线程的参数列表,无参数时为NULL

    2.CreateThread()

    函数返回值:

    成功返回新线程的句柄,失败返回NULL。

    HANDLE thread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);

    CloseHandle(thread);  //关闭线程

    • 第一个参数表示线程内核对象的安全属性,一般传入NULL表示使用默认设置
    • 第二个参数表示线程栈空间大小。传入0表示使用默认大小(1MB)
    • 第三个参数传递了一个函数的地址,也是我们要制定的新线程。
    • 第四个参数是传给新线程的参数指针。
    • 第五个参数指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
    • 第六个参数将返回线程的ID号,传入NULL表示不需要返回该线程ID号。

    3.WaitForSingleObject()

    函数功能:WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到 WaitForSingleObject有返回值才执行后面的代码。此外,当dwMilliseconds设置为特殊值0时,测试hHandle核心对象是否被激发,函数立即返回。

    函数原形:

    DWORD WINAPI WaitForSingleObject(

      HANDLE hHandle,

      DWORD dwMilliseconds

    );

    第一个参数为要等待的内核对象。

    第二个参数为最长等待的时间,以毫秒为单位,如传入5000就表示5秒,传入0就立即返回,传入INFINITE表示无限等待。

    因为线程的句柄在线程运行时是未触发的,线程结束运行,句柄处于触发状态。所以可以用WaitForSingleObject()来等待一个线程结束运行。

    函数返回值:在指定的时间内对象被触发,函数返回WAIT_OBJECT_0。超过最长等待时间对象仍未被触发返回WAIT_TIMEOUT。传入参数有错误将返回WAIT_FAILED

     4.WaitForMultipleObjects()

    函数原形:

    DWORD WaitForMultipleObjects(  

      DWORD nCount,             

      CONST HANDLE *lpHandles,  

      BOOL fWaitAll,         

      DWORD dwMilliseconds    

    );   

    • nCount 句柄的数量 最大值为MAXIMUM_WAIT_OBJECTS(64)  
    • HANDLE 句柄数组的指针。  
    • HANDLE 类型可以为(Event,Mutex,Process,Thread,Semaphore )数组  
    • BOOL fWaitAll 等待的类型,如果为TRUE 则等待所有信号量有效在往下执行,FALSE 当有其中一个信号量有效时就向下执行  (表示如果为true,则表示所有的IpHandles都必须激发,此函数才得以返回,否则,此函数将在任何一个IpHandle激发时就返回。)
    • DWORD dwMilliseconds 第四个参数表示超时也返回,可为0,立即返回,INFINITE表示无穷等待,如果没有信号量就会在这死等。 

     5.CreateEvent()

    HANDLE CreateEvent(
    LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性,一般为NULL
    BOOLbManualReset,// 复位方式,创建的Event是自动复位还是人工复位.如果true,人工复位
    BOOLbInitialState,// 初始状态,指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
    LPCTSTRlpName // 事件对象的名称。在OpenEvent函数中可能使用。
    );
     
    6.SetEvent/ResetEvent
    函数原型:
    BOOL SetEvent(HANDLE hEvent);
    BOOL ResetEvent(HANDLE hEvent);
     
    SetEvent,ResetEvent,CreatEvent三者之间的关系:

    CreatEvent():创建一个事件对象

    SetEvent():把指定事件对象的状态设置为发信号状态(激发事件)

    ResetEvent():把指定事件对象的状态设置为不发信号状态

  • 相关阅读:
    18 | 案例篇:内存泄漏了,我该如何定位和处理?
    17 | 案例篇:如何利用系统缓存优化程序的运行效率?
    16 | 基础篇:怎么理解内存中的Buffer和Cache?
    Scrapyd 改进第一步: Web Interface 添加 charset=UTF-8, 避免查看 log 出现中文乱码
    scrapy_redis 相关: 将 jobdir 保存的爬虫进度转移到 Redis
    lxml.etree.HTML(text) 解析HTML文档
    CSS/Xpath 选择器 第几个子节点/父节点/兄弟节点
    scrapy_redis 相关: 查看保存的数据
    scrapy 通过FormRequest模拟登录再继续
    python2 python3 转换,兼容
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5786731.html
Copyright © 2011-2022 走看看