《深入浅出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操作系统提供了四种同步机制,关键区域、号志、事件和互斥器。

原文地址:https://www.cnblogs.com/jefflee/p/6920034.html