`

一步一步的接近线程同步

阅读更多
        前几天,我尝试着建立了第一个基于SDK的窗口之后,那个窗口就像是通向一片未知世界的通道一样。我推开窗,发现外面的世界真的很精彩,同时也很无奈,因为我依旧有着很多的迷惑。"问题男"老大指出我的程序应该使用GetMessage方法,这样会在没有消息的时候,线程会被Suspend。如果使用PeekMessage则会几乎耗尽所有的CPU时间。老大的回复促使我重新去看了一下MFC的框架中处理消息循环的代码,同时更促使我去了解GetMessage方法背后的事情。由于没有办法看到这个方法的源代码,只能通过一些资料去总结,去试验,去猜测了。写得不对的地方,还请各位多多指教!
        根据MSDN文档所说的,The GetMessage function retrieves a message from the calling thread's message queue. The function dispatches incoming sent messages until a posted message is available for retrieval。也就是说在线程消息队列里至少有一条消息,方法才会返回。也有文档说,GetMessage方法是一个具有同步行为的方法。而这些从整体来看,关键是同步(synchronization)了。那么就先从同步入手吧。
        查阅了一些资料,对线程同步有了一个较为清晰的认识。线程同步的意义在于保持公共资源在各个线程的一致性。举个例子:对于一个全局变量,一个线程需要修改它,而另外几个线程则需要读取它,那么如果负责修改的线程在修改过程中不禁止其他线程访问这个全局变量的话,则无法保证其他线程读取到的是同一个值。毕竟一个线程修改内存空间的内容是需要时间的。为了实现线程同步,通常利用以下几种机制:Mutex Objects(互斥量)、Semaphore Objects(信号量)、Critical Section Objects(临界区)和Event(事件)。这些内容在很多文档资料中都有讲述,这里就不多说了。那么跟GetMessage方法联系起来,GetMessage操作的结果是从消息队列中取走一条消息,它需要等待队列中存在至少一条消息这样的事件,也就是说当消息队列中存在至少一条消息的时候会变为有信号的状态,GetMessage方法才得以返回。因此我们可以得出GetMessage是通过事件机制来实现同步的。
        在查找线程同步的资料的过程,我还从MSDN中,发现了一个新的面孔——Wait Function。所谓Wait Function就是允许线程阻塞自己的操作的函数。 而Wait Functions只有当一定的条件成立的情况下才会返回,当一个Wait Function被调用的时候,它会去检查返回的条件是否成立,如果不成立则会进入等待状态直到返回的条件成立或者超时,而等待的状态是不会消耗CPU时间的。据此,我们可以推断GetMessage就是属于Wait Function。Wait Function有四类:single-object 、multiple-object 、alertable、registered。从MSDN中的Wait Function Reference中可以找到相应的信息。
        综上所述,GetMessage本身是一个Wait Function,可以实现线程的阻塞,从而进入线程Suspend的状态;同时在Function中通过事件的机制来实现同步。开始一步一步接近线程同步,我想下一步就该是自己写个消息处理函数来替代GetMessage来玩玩了,呵呵~~~
分享到:
评论

相关推荐

    龟兔赛跑 C++多线程编程

    同时,我们还添加了线程同步机制,确保主线程等待兔子和乌龟完成比赛之后再结束程序。 ### 总结 通过本案例的学习,我们可以深入了解如何在C++中利用多线程技术来模拟并行处理过程。这种方式不仅可以提高程序的执行...

    ThreadsCopyFile.rar

    文件被划分为多个相等或接近相等的块,每个线程负责一块的复制。为了确保线程间正确地读写文件,可能需要使用synchronized关键字或者使用Java并发库中的Lock进行同步控制,防止不同线程间的交错操作导致数据错乱。 ...

    C#网络通信之------同步套接字开发

    在IT行业中,网络通信是构建分布式系统和网络应用程序的基础,而C#作为...在进一步完善这个程序时,可以考虑添加错误处理机制,优化性能,以及扩展功能,如多线程处理、心跳机制等,使其更加接近实际生产环境的需求。

    18308045-谷正阳-并行与分布式计算作业3-v11

    为解决这个问题,选择了spin lock(自旋锁)作为同步机制,因为其适用于只有一个步骤的运算,如一步乘法、一步加法和一步数据转移。在重新分析后,tsan未报告错误,但perf分析显示,使用锁的多线程程序效率降低,...

    Directx12 3D游戏程序设计1

    3. **同步机制**:由于DirectX12更接近硬件,同步机制变得更为重要。Fence对象和事件对象是常用的同步工具,用于确保GPU完成特定任务后再进行下一步操作。 4. **描述符堆**:描述符堆是DirectX12中一种管理资源引用...

    操作系统实验程序参考

    7. **并发编程**:在多线程环境中,理解线程间的交互和同步非常重要。实验可能涵盖线程的创建、同步(如互斥锁、条件变量)和通信(如管道、消息队列、共享内存)。 8. **系统调用**:通过系统调用,用户程序可以...

    《第一行代码JAVA》PPT与源代码.zip

    10. **多线程**:线程的创建方式,同步机制,线程间通信等。 源代码部分则提供了实际的示例,通过动手实践,你可以更深入地理解这些概念。例如,你会看到如何创建一个简单的"Hello, World!"程序,到实现复杂的类和...

    MySQL 5.5 新特性介绍和性能评估

    2. **InnoDB 成为默认引擎**:MySQL 5.5 将 InnoDB 设为默认存储引擎,这标志着 MySQL 在事务处理和支持 ACID 特性方面迈出了重要一步。之前的默认引擎 MyISAM 虽然提供了较高的读取速度和简单的文件结构,但缺乏...

    蚂蚁金服Java高级岗位面试真题

    在Java开发者的职业生涯中,尤其是追求高级岗位的过程中,面试无疑是至关重要的一步。蚂蚁金服作为全球知名的金融科技企业,其Java高级岗位面试不仅关注技术深度,还强调实际应用和问题解决能力。本文将深入探讨面试...

    网络游戏-预网络器.zip

    预网络器(Predictive Networking)是网络游戏中的一个关键技术,它旨在减少延迟并提高游戏的实时性,使得玩家在游戏中能够获得更流畅、更接近即时的体验。 1. **预网络器的概念** 预网络器是一种技术手段,它通过...

    Linq to sql

    5. **异步编程**:LINQ to SQL支持异步查询,这在处理大数据集或避免阻塞UI线程时非常有用。使用`.Async`后缀,如`ToListAsync()`,可以轻松地将同步查询转换为异步操作。 6. **事务管理**:DataContext提供了事务...

    [游戏编程书籍]. 3D Game Engine Programming.rar

    与OpenGL相比,Direct3D更注重于Windows环境的优化,提供了更接近底层硬件的访问,使得开发者能够编写出高效能的3D应用。在本书中,读者将学习如何使用Direct3D创建复杂的3D场景,管理资源,以及实现高级特效。 3D...

    cPP.rar_有序数组乱序

    此外,由于使用了全局随机数生成器,该算法不是线程安全的,如果在多线程环境中使用,需要采取适当的同步措施。 总结起来,乱序有序数组在不引用新数组空间的情况下,可以采用Fisher-Yates算法。这种算法简单、高效...

    易语言八皇后.rar

    此外,此问题的解决还可以扩展到多线程编程,通过并行计算来寻找多个解,这将涉及到易语言中的并发与同步控制结构。 总结来说,《易语言八皇后》教程旨在帮助编程初学者掌握易语言的基本编程概念,并通过解决实际...

    2013阿里巴巴实习生笔试试题.doc

    4. 知识点:并发编程与线程同步 - 由于全局变量a的原子操作,可能存在并发修改的情况,导致输出结果的不确定性,但不会出现D.22这种不可能的组合。 5. 知识点:递归函数 - 函数fun()是一个递归函数,终止条件是x=...

    手机/PDA程序设计入门-Game API入门

    在进入手机/PDA程序设计的世界时,Game API的掌握是至关重要的一步,尤其对于初学者而言。Game API是专门为了创建游戏或者与游戏相关的应用程序而设计的一组接口和工具,它们提供了一系列的功能,使得开发者能够更...

    os 开发资料手册

    7. **多任务与并发**:解释线程、进程的概念,以及同步和互斥机制,如信号量、锁和条件变量。 8. **系统调用**:描述系统调用的接口和实现,以及如何创建自定义的系统调用。 9. **编程模型**:涵盖不同CPU架构下的...

    zig-dlmalloc:将dlmalloc-2.8.6进行中的工作端口移植到Zig

    2. **线程安全**:通过锁或其他同步机制,确保在多线程环境下安全地分配和释放内存。 3. **可扩展性**:支持定制的内存分配策略,如配置参数,以适应不同的应用场景。 移植dlmalloc至Zig的过程主要包括以下几个步骤...

    Parallel_Algorithms

    - **BSP模型(Bulk Synchronous Parallel)**:该模型更接近现实世界中的并行系统,强调了大规模并行计算中的同步点和通信开销。 - **LogP模型**:这是BSP模型的一个扩展,更加细致地考虑了并行系统中的通信延迟和带宽...

Global site tag (gtag.js) - Google Analytics