windows程序设计(24):再谈多线程

之前说的实在是太肤浅了,现在有了一点心的认识,就多说几句。

首先,为什么要搞多线程?除了线程间通信方便之外,还有一个重要的原因是线程可以被分配时间片,这样,假如一个程序有很复杂的任务要执行,需要花很长时间,那么我们可以将它写成一个多线程的,让它有多次机会被CPU“临幸”到,所以多线程程序运行起来,感觉CPU的占有率特别高。

当然,线程之间的同步是一个非常关键的因素,因为CPU的时钟一到,就切换走了,是按照一条机器指令执行完就切换的,并不是一行C语句之类的;假如线程1向一个变量里存了一个值,下面会使用它,但是使用之前切换到另一个线程2,线程2向其中重新写了一个值,那么等下一次线程1再去读里面的值时,就会发生了变化。所以,对于多个线程共享变量,一定要同步机制保护起来。

程序员经常使用的同步机制是关键代码段,它的作用如下:每个进程在访问共享变量前,先进入关键代码段,如果能进入,那么在里面完成对共享变量的操作,如果不能进入关键代码段,则原地等待。如果期间CPU切换到另一个线程,那么它在访问共享变量前,也要进入关键代码段才能继续,但是由于前一个线程在关键代码段中,还没有出来,所以他进不去,自然也就无法访问共享变量了。直到前一个线程退出关键代码段后,后一个线程才有机会访问共享代码。对于那些并没有使用关键代码段保护的操作,依然是正常的执行,不受影响。

说白了,关键代码段保护的,不是某个被共享的变量,而是读写变量的动作!所以在程序中,如果有多个线程都要访问一个共享的变量,那么它们都要在访问共享变量前加上与关键代码段相关的代码。


在程序的设计时,关键代码段所保护的操作应该越少越好,因为多线程的目的是为了让程序“并发”执行,(对于单核CPU,是更多的时间片“临幸”到一个进程的多个线程上),但是如果有一个线程中关键代码段所保护的操作要执行很长时间,那么其他线程如果也有访问关键代码段的操作,就只能干等着。这也就违背了多线程的本意了。



你可能感兴趣的:(windows程序设计(24):再谈多线程)