读书笔记

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

2018-01-20  本文已影响8人  046ef6b0df68

文|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. 多线程设计:

三、快跑与等待

四、同步控制

  1. SendMessage是同步行为,PostMessage是异步行为
  2. Critical Section的几个关键问题
  1. 不要长时间锁住一份资源
  2. 当使用同步机制保护一份资源时,一定考虑好线程必须多快释放这份资源,才能确保整个系统运行很平顺。
  3. 常用防止死锁的办法:All-or-nothing
  4. Mutex的几个关键问题
  1. mutex与Critical Section比较
mutex Critical Section
核心对象花费时间长 非核心对象花费时间短
跨进程 同进程
可指定结束等待时间 不可指定
  1. Semaphores的几个关键问题
  1. Event几个关键问题

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

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

猜你喜欢

热点阅读