《Win32多线程程序设计》-侯杰【最后更新日期:16/02/23

来源:互联网 发布:免费的云计算平台 编辑:程序博客网 时间:2024/05/30 04:48

读者背景:零基础


第1章 为什么要千头万绪


我们通过API函数调整进程的优先级别是基于用户态的,核心态的进程优先级对用户是透明的,用户也无权干涉。


进程包含:内存和资源。资源包括核心对象(file handles和线程)、USESR资源(对话框和字符串)、GDI资源(Device Context和brushes)。


属于不同进程的线程,互相不能共享内存。而同一进程的线程,可共享进程的所有内存。若需要进程间通信,则要共享两进程的内存。

有一个任务,用单线程做两遍,比单核cpu用两个线程各做一遍速度要快。其中有context switch的时间消耗。


竞争条件(race conditions):假设两个进程P1和P2共享了变量a.在某一执行时刻,P1更新a为1,在另一时刻,P2更新a为2.因此两个任务竞争地写变量a.在这个例子中,竞争的“失败者”(最后更新的进程)据诶的那个了变量a的最终值。


子操作:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何context switch,目的是减少共享变量“可见性”的开销。


可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。(理解为同步)


第2章 为什么要千头万绪

多线程程序无法预期:多线程程序是无法预期其行为的(影响因素很多,例如,CPU的速度、线程的工作、CPU的忙碌程度等非常多的因素)。结果就是,如果程序完蛋了,很难重复其过程。


多线程程序的执行次序无法保证:线程的执行顺序无法保证。多个线程去完成相同的任务,并不确定最先开启的线程和最后开启的线程哪个先完成。


Task Switches可能在任何时刻任何地点发生。


线程对小的改变有高度的敏感:线程中增加一定的计算量,会使结果发生很大的变化。

-----------------------------------------------------------------------------------------------------------------------------------------------------------2016/2/23 16:27


0 0