美文网首页读书笔记
读书笔记のWin32 多线程程序设计

读书笔记のWin32 多线程程序设计

作者: 046ef6b0df68 | 来源:发表于2018-01-20 12:24 被阅读8次

文|Seraph

一、为什么要“千头万绪”

  1. 合作型多任务:分享CPU是程序的责任(而非操作系统),所以需要各个程序相互合作,不能一个程序咬住CPU不放。
  2. 一个永远有反应的UI是很重要的。
  3. 进程本身并不能够执行,它只是提供一个安置内存和线程的地方。
  4. Unix中,进程与其主线程是相同的东西。
  5. “两个线程同时计算PI”所花费的时间比“一个线程接连做两次一样的工作”所花费的时间长一点,因为需要上下文切换。所以说,多线程的好处不是缩短了总的执行时间,而是新的执行流程,同时也高效的利用CPU的空闲时间。
  6. 多线程给我们带来了很多好处,但是也会引发很多潜在性的严重问题,所以我们需要着重关注多线程的设计

二、线程的第一次接触

  1. #define WINAPI __stdcall(windef.h定义)。
  2. 在编译时,使用/MT/MD选项,表示使用多线程版本的C runtime library。
  3. 一般重导至文件中比屏幕上输出更快些。
  4. 为了安全起见,你不可能根据一个线程的ID而获得其Handle。
  5. Win32核心对象
中文名称 英文
进程 processes
线程 threads
文件 files
事件 events
信号量 semaphores
互斥器 mutexes
管道 pipes(分为named和anonymous)
  1. GDI对象有单一拥有者,不是进程就是线程。核心对象可以有一个以上的拥有者,甚至可以跨进程。
  2. CloseHandle重要性,使核心对象引用减一(核心对象只有在引用计数为0时,才会被清理)
  3. worker线程,是指完全不牵扯到GUI,纯粹做运算的线程。
  4. 多线程设计:简单和安全,更甚于复杂和速度。
  5. 最低表面积,意指必须被线程共享的数据结构。这是我们多线程设计希望达到的目录之一。
  6. 多线程的数据块,最好是用heap。全局变量容易被修改,堆栈变量容易超过生成范围。
  7. 多线程使用数据时,不要直接读取界面或者随时可能被改变的值,可以复制一份过来,再进行处理。意思是,当worker线程启动后,它并不需要任何来自对话框的信息或全局变量。
  8. 多线程设计:
  • 各线程数据要分离开来,避免使用全局变量
  • 不要在线程之间共享GDI对象
  • 确定你知道你的线程状态看,不要径自结束程序而不等待它们的结束
  • 让主线程处理用户界面

三、快跑与等待

四、同步控制

  1. SendMessage是同步行为,PostMessage是异步行为
  2. Critical Section的几个关键问题
  • Critical Section不是核心对象,没有所谓的handle
  • 如果进入Critical Section那个线程结束掉或当掉了,而没有调用LeaveCriticalSection的话,系统没办法将该Critical Section清除掉。
  1. 不要长时间锁住一份资源
  2. 当使用同步机制保护一份资源时,一定考虑好线程必须多快释放这份资源,才能确保整个系统运行很平顺。
  3. 常用防止死锁的办法:All-or-nothing
  4. Mutex的几个关键问题
  • mutex对象对整个系统而言是全局的
  • CreateMutex指定已经存在的mutex名称,会返回原mutex handle
  • 如果线程拥有一个mutex而在结束前没有调用ReleaseMutex,则下一个等待中的线程会被以WAIT_ABANDONED_0通知(表示被舍弃)
  • CreateMutex时,赋值TRUE可立即拥有mutex,而不会可能出现其他线程抢占
  1. mutex与Critical Section比较
mutex Critical Section
核心对象花费时间长 非核心对象花费时间短
跨进程 同进程
可指定结束等待时间 不可指定
  1. Semaphores的几个关键问题
  • Semaphores不像mutexes,它并没有所谓的“wait abandoned”状态可以被其他线程侦测到
  • 任何线程都可以在任何时间调用ReleaseSemaphore
  • ReleaseSemaphore函数的参数lpPreviousCount所传回来的是一个瞬间值,不可把lReleaseCount加上*lpPreviousCount就当做semaphore的现值
  1. Event几个关键问题
  • Event有别于其他对象的是,它的状态完全在你掌控之中
  • SetEvent与PulseEvent区别:在自动重置模式下,是等同的;在手动重置的模式下,PulseEvent把Event对象设为激发状态,唤醒“所有”等待中的线程,然后Event恢复为非激活状态

五、 不要让线程成脱缰野马

  1. 终止一个线程的方法:设立一个标志(例如主线可操作的事件),在线程种用WaitForSingleObject等待退出事件激活。
  2. 线程优先级一般是进程叠加或减去。
  3. 优先级很难控制,尽量不要自己去控制优先级。
  4. 启动一个线程之前,可以使用挂起,初始化线程后,再启动。

相关文章

  • 读书笔记のWin32 多线程程序设计

    文|Seraph 一、为什么要“千头万绪” 合作型多任务:分享CPU是程序的责任(而非操作系统),所以需要各个程序...

  • Win32多线程程序设计读书笔记

    为什么多线程? 多线程并不一定是最好的,合适才是最好的。 多线程主要的优点是价廉物美,启动快、退出快、与其他线程共...

  • Win32多线程程序设计

    一、上路吧,线程 从Win32角度看,进程含有内存(理论上可达2G)和资源,本身并不能够执行,只是提供一个安置内存...

  • [C++并发编程实战]创建多线程

    不同平台的多线程 POSIX线程 pthread_create Win32线程 CreateThread begi...

  • Java多线程 - 如何正确的终止线程

    最近打算读一下《实战java高并发程序设计》,夯实一下java多线程的知识。接下来应该会写一系列的读书笔记,里面会...

  • Java多线程汇总

    1、多线程介绍 多线程优点 资源利用率好 程序设计简单 服务器响应更快 多线程缺点 设计更复杂 上下文切换的开销 ...

  • 2017.10.12MFC总结

    今天主要学习了多线程程序设计 学习了进程和线程的概念,多线程的优点! 之后学习基于MFC的多线程编程,MFC有两种...

  • Java编程思想读书笔记

    此篇Java编程思想读书笔记,没有涉及到多线程,多线程部分会有专门专题讲解。 读书笔记记录了重点章节和概要,更详细...

  • Java Concurrency <概览>

    Java Concurrency <概览> Java 多线程的优点 更好的利用资源 程序设计变的简单 响应更加迅速...

  • 多线程程序设计

    写在之前 以下是《Java8编程入门官方教程》中的一些知识,如有错误,烦请指正。涉及的程序如需下载请移步http:...

网友评论

    本文标题:读书笔记のWin32 多线程程序设计

    本文链接:https://www.haomeiwen.com/subject/rzgdoxtx.html