Win32多线程程序设计 - [美] Jim Beveridge, Robert Wiener

Win32多线程程序设计

[美] Jim Beveridge, Robert Wiener

出版时间

2002-01-01

ISBN

9787560926384

评分

★★★★★
书籍介绍
《Win32多线程程序设计》全书共分三篇。第一篇包括线程的启动和结束、核心对象、激发和未激发状态的意义、同步机制及其用途;第二篇介绍C runtime函数库和MFC对线程的支持、如何在USER和GDI的限制之下施行对线程等内容;第三篇谈论如何组织一个程序,使它有效支持多线程。
AI导读
核心看点
  • 系统讲解Win32线程启动、同步及核心对象机制
  • 深入剖析MFC与C runtime对多线程的支持细节
  • 提供组织高效多线程程序的最佳实践与架构建议
适合谁读
  • Windows平台C++多线程编程初学者
  • 希望系统梳理Win32底层机制的开发者
  • 对侯捷翻译风格及经典技术书籍感兴趣的读者
读前提醒
  • 部分CRT线程安全描述已过时,需结合现代环境理解
  • 建议配合代码实践,避免仅停留在理论阅读层面
  • 注意区分GUI线程与Worker线程的严格使用边界
读者共识
  • 公认Win32多线程入门最佳教材,没有之一
  • 侯捷译文浅显易懂,注释独到,极大降低阅读门槛
  • 内容经典但略显陈旧,适合建立基础认知体系

本导读基于书籍简介、目录、原文摘录、短评和书评生成,不等同于全文精读。

精彩摘录
  • "进程(Processes) 从Win32 的角度来看,进程含有内存和资源。被进程拥有的内存,理论上可以高达2GB。资源则包括核心对象(如file handles 和线程)、USER 资源(如对话框和字符串)、GDI 资源(如Device Context 和brushes)。 进程就像一本活页笔记夹,你可以在其中的活页上写东西,也可以擦掉内容或甚至整页撕掉,活页笔记夹只是持有那些东西而已。同理,进程本身并不能够执行,它只是提供一个安置内存和线程的地方(译注)。 译注 Matt Pietrek 在其Windows 95 System Programming SECRETS(Windows 95 系"
  • "Windows 3.x 的多任务 Windows 3.x 的确有支持抢先式多任务,但程序员却不可得之。由于DOS 程序毫无共享观念,抢先式多任务是让它们不得擅专整部机器的唯一方法。而所有Windows 程序则被“放在一起,视为单一的DOS 程序”。所以Windows 3.x 对DOS 程序的确是抢先式多任务,但对于Windows 程序则不是。"
  • "如果你曾经尝试使用Windows NT 3.x 的File Manager 连接一个忙碌的服务器,我想你会知道,File Manager 基本上会悬在那儿一动也不动,直到服务器完成所有操作。程序员绝对没办法改善这种局面,因为操作停滞在操作系统里面。如果它停滞在你的程序中,你可以放一个PeekMessage()循环。但是对于操作系统,你没有太多的控制能力。因此,如果文件操作需要一段长时间的话,控制权不可能立刻传回到用户手上。"
  • "内存 每一个进程都关系到内存。内存就像是前面所说的活页笔记夹中的活页纸,它代表的意义完全得看纸面上写些什么而定。内存可以大致分为三种类型: i Code i Data i Stack Code 是程序的可执行部分,一定是只读(read only)性质。这是CPU 唯一允许执行的内存。可执行Windows NT 的两种芯片:Intel 芯片和RISC 芯片都有这项限制。 Data 是你的程序中的所有变量(不包括函数中的局部变量),可以区分为全局变量和静态变量两种。当然线程也可以使用malloc()或new 动态配置内存。 Stack 是你调用函数时所用的堆栈空间,其中有局部变量。每个线程产生时配"
  • "如果一个进程没有在结束之前针对它所打开的核心对象调用 CloseHandle( ),操作系统会自动把那些对象的引用计数下降1。虽然你可以 依赖系统做实体(physical)上的清除(cleanup)工作,然而逻辑上的清除 工作又是完全不同的一回事,特别是如果你有许多个进程的话。因为系统并不 知道对象实际代表什么意义,所以它不可能知道解构顺序是否重要。 如果一个进程常常产生“worker 线程”(就是无界面显示任务的线程,只做后台运算)而老是不关闭线程的 handle,那么这个进程可能最终有数百甚至数千个开启的“线程核心对象”留 给操作系统去清理。这样的资源泄漏(resource leaks)可"
  • "线程的handle 是指向“线程核心对象”,而不是指向线程本身。对大部 分API 而言,这项差异没什么影响。当你调用CloseHandle( )并给予它一个 线程handle 时,你只不过是表示,你希望自己和此核心对象不再有任何瓜葛。 CloseHandle( )唯一做的事情就是把引用计数减1。如果该值变成0,对象会 自动被操作系统摧毁。 可以使用 GetExitCodeThread( )等待一个线程的结束,然而这并不是好方法。有隐患: GetExitCodeThread( )的一个糟糕行为是,当线程还在进行,尚未有所 谓结束代码时,它会传回TRUE 表示成功。如果这样,lpExitCode "
  • "程序启动后就执行的那个线程称为主线程(primary thread)。主线程有 两个特点。第一,它必须负责GUI(Graphic User Interface)程序中的主消 息循环。第二,这一线程的结束(不论是因为返回或因为调用了ExitThread( )) 会使得程序中的所有线程都被强迫结束,程序也因此而结束。其他线程没有机 会做清理工作。"
  • "GUI 线程的定义是:拥有消息队列的线程。任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理。所有对此窗口的改变也都应该由该线程完成。 如果worker 线程也产生了一个窗口,那么就会有一个消息队列随之被产生出来并且附着到此线程身上,于是worker 线程摇身一变成了GUI 线程。这里的意思是,worker 线程不能够产生窗口、对话框、消息框,或任何其他与UI 有关的东西。 如果一个worker 线程需要输入或输出错误信息,它应该授权给UI 线程来做,并且将结果通知给worker 线程。"
作者简介
Jim Beveridge进入操作系统的研究领域已有15年,从多处理器数据库到microkernel操作系统的开发,他都有经验。他于Rochoester Institure of Technology获得计算机科学学士学位。他目前受聘为Turning Point Software公司顾问。
用户评论
线程入门 一地API
图书借还处(老馆二楼流通书库) TP316.7 160 在架上
快速翻完了,到后面就迷迷糊糊了,感觉还是要实践才能真正弄懂线程
书讲得很细致,不知道侯捷大人写作的时候是否运用了在我们这儿讲课时提倡的深夜泡咖啡精神。
老书了,启发不够震撼性
前边win体系的,基本现在也还能用吧,后边的,感觉有一些已经被淘汰了,可快速看完
看的时候总担心已经过时了,但是用的时候还是很顺手,经典永流传。
举了很多例子,对于理解多线程还是很有帮助
侯捷的都推荐
可惜移动时代没MS啥事
收藏