• 《深入浅出MFC》第十四章 多线程程序设计


    模块表示一段可执行的程序,其程序、数据、资源都被加载到内存中,由系统构建一个数据结构来管理它,就是一个模块,这个数据结构被称作MDB。进程是一大堆拥有权的集合,进程拥有地址控件,动态配置的内存、文件、线程、和一系列模块,操作系统用PDB的数据结构来管理它。线程表示程序代码的执行事实,系统用TDB数据结构来记录和管理线程相关的内存地址控件,数据、消息队列等。

    程序的执行发生在线程上而非进程上,因此CPU的调度单位是线程而非进程。线程的调度完全根据优先级来判断,但是调度器会动态调整线程的优先级一次来提高系统的响应性。

    线程的执行上下文用来管理线程执行时的动态信息,以便线程被再次分配CPU时能从上次停止的位置执行。

    在MFC的层面,线程被分为Worker Thread和UI Thread,通过CreateThread产生的线程,并指定一个线程函数,这个线程就为Worker Thread。当线程中带有消息循环并处理某些消息,线程就称为UI Thread。所有与UI相关的操作都应该在UI线程中执行,与UI无关的纯运算或通信的工作最好放到Worker Thread中。

    在MFC中通过AfxBeginThread产生线程,不直接使用CreateThread是因为前者会执行一些与框架相关的代码。使用AfxBeginThread产生的线程为Worker Thread。若要产生一个UI Thread,必须要首先定义一个CWinThread的派生类。

    创建线程时需要指定线程函数,线程函数只能是全局函数或C++类的static成员函数。当为不同的线程指定相同的线程函数时,这时要特别注意线程函数中使用的全局变量和静态变量,因为多个线程会共享这些数据,至于放到堆栈中的变量或对象则不会由问题,因为每个线程都有自己的堆栈。

    通过派生自己的CWinThread可以创建UI Thread,通过函数AfxBeginThread(RUNTIME_CLASS)。当线程函数return时线程便结束了,或在线程函数中调用AfxEndThread结束一个线程。

    当进行多线程程序开发时,如果多个线程之间可以相互联系相互通信,将会使程序变的非常复杂,这时需要使用线程同步机制才能处理。Windows操作系统提供了四种同步机制,关键区域、号志、事件和互斥器。

  • 相关阅读:
    Linux中的文件特殊权限
    服务器管理
    程序图表统计知识
    EasyUI 添加tab页(iframe方式)
    打造自己的reset.css
    CI的知识点
    easyui资源
    eval解析JSON中的注意点
    如何在一个frame中调用另一个frame中的javascript函数
    Egret 摇一摇功能
  • 原文地址:https://www.cnblogs.com/jefflee/p/6920034.html
Copyright © 2020-2023  润新知