zoukankan      html  css  js  c++  java
  • 《Win32多线程程序设计》读书笔记(三)

    第三章

    忙等 Busy Waiting

    忙等,在这里就是不断调用GetExitCodeThread函数,直到结果不再是STILL_ACTIVE,它十分浪费CPU时间。

    举个最简单的例子:

    ...
    GetExitCodeThread(hThrd, &exitCode)
    while(STILL_ACTIVE == exitCode);
    ...
    

    这就是忙等。

    处于忙等会让主线程一直处于这个while循环中去判断exitCode的值是否等于STILL_ACTIVE,这实在是太浪费时间了!不仅如此,你可能由于这一个程序,导致其他进程资源被抢占,也就是其他应用卡顿,这简直是灾难!

    所以千万不要用忙等。

    性能监视器 (Performace Monitor)

    在现在的Windows10系统中依旧有原来老NT老95的性能监视器的功能的系统应用。

    也就是现在的任务管理器(Task Manager),里面可以监视各个进程占用资源情况,性能情况等。

    等待一个线程的结束

    Win32提供了一个名为WaitForSingleObject的函数,能够在某个线程结束时被调用。

    DWORD WaitForSingleObject(
    	HANDLE hHandle,
        DWORD dwMilliseconds
    );
    

    dwMilliseconds指等待的最长时间,如果到了最长时间,handle尚未成为激发状态,则还是要返回。指定0,表示立即返回;指定INFINITE表示无穷等待。

    如果函数失败,返回WAIT_FAILED,可以用GetLastError获取错误信息。

    函数成功时,如果等待的目标核心对象变成激发状态,返回WAIT_OBJECT_0

    如果等待的核心对象变成激发态之前,等待时间过了,则返回WAIT_TIMEOUT;

    如果一个拥有mutex(互斥器)的线程结束前没有释放mutex,则传回WAIT_ABANDONED

    通过这个函数,就可以改良之前的代码:

    WaitForSingleObject( hThrd, INFINITE);
    

    被激发的对象 (Signaled Objects)

    可被WaitForSingleObject使用的核心对象有两种状态:激发与未激发。

    当核心对象被激发时,会导致WaitForSingleObject醒来。Wait也是如此。

    线程执行时,线程对象处于未激发状态;线程结束时,线程对象就被激发。


    2020.04.13

  • 相关阅读:
    自己开发网站全文检索系统
    中国摇滚二十年(经典100首歌曲)
    有一首歌
    Snoopy.class.php使用手册
    wp-Syntax 插件使用方法
    rabbitmq使用
    小程序相关功能的实现
    知识链接
    celery使用
    阿里云服务器部署项目注意事项
  • 原文地址:https://www.cnblogs.com/lazy-v/p/12691052.html
Copyright © 2011-2022 走看看