实例解析C++/CLI线程之多任务[VC/C++编程]
本文“实例解析C++/CLI线程之多任务[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
简介
从处理器的角度来看,线程是一个单独的履行流程,每个线程都有各自的存放器及仓库上下文.普通来说,在系统中只有一个处理器或处理器只有一个核心时,运行时环境在一个时间片内只能履行一个线程,当线程未能获得所需的资源时,线程的履行就会被中止,且会一向等到相关操作的完成,如I/O;大概在线程用完它的处理器时间片时,也会被中止下来等候.而处理器把履行流程从一个线程切换到另一个线程时,这称为"上下文切换";当某个线程变成"阻塞"状况,从而履行另一个线程时,系统有效地削减了处理器闲暇时间,这称为"多任务".
当程序履行时,系统知道可以从磁盘上某处获得相关的指令及静态数据,程序会被分配到一组包含虚拟内存在内的地址空间,这个运行时上下文被称为"进程".但是,在一个进程可以运行之前,它必须拥有至少一个线程,也就是说,当一个进程被成立时,它自动被赋予了一个线程,这称为"主线程".但是话说回来,这个线程与之后这个进程所成立的线程相比,没有任何差别之处,它只不过刚好是这个进程的第一个线程罢了.普通来说,在程序的掌握之下,进程内的线程数在运行时会有所改变,任何线程都可以成立其他的线程,但不管怎样,线程不拥有它所成立的线程,全部进程内的线程都是作为一个整体属于这个进程.
可把进程要完成的工作分成差别的"子任务",每一部份都由差别的线程来履行,这称为"多线程".进程内的每个线程同享一样的地址空间与进程资源,当最后一个进程内的线程完毕时,父进程就完毕了.
为什么进程内要有多个线程呢?假如进程只有一个线程,那么它的履行流程是自上而下次序履行的;当线程阻塞,而又没有其他的活动线程处于等候状况时,系统就会进入闲暇状况;假如此时进程的子任务必须被次序地履行,那么这种情形就不可避免,将耗费大量的时间来等候.但是,绝大大都的进程都不是这样的,试想有这样一种情形,某个进程有多个选项,用户可以挑选此中一些选项,由此产生的计算会利用内存或文件中的数据,并生成后果,假如能从中分出一些新的线程,那么进程没必要等候前一个计算的后果,便可以持续承受新的计算恳求.此外,通过指定线程的优先级,进程可只在更关键的线程阻塞时,才运行次关键的线程.
在有多个线程的情形下,某些线程可负责程序的主要工作,而另一个线程可用于处理键盘和鼠标的输入.比方,用户大概会认为前一次恳求并非盼望的行动,从而但愿撤消由前一次恳求产生的那一个线程,这时便可在某个下拉菜单中举行挑选,由一个线程去终止另一个线程.
另一个例子就是打印假脱机程序,它的任务是保持打印机尽大概地满载工作,并处理用户的打印恳求;假如这个程序必必要等到前一项打印工作完成,才能承受新恳求的话,用户大概会感到非常的不满.当然,程序也可周期性地停下打印工作,来查看能否有新的未处理恳求(这称为"轮询"),但是,假如没有新恳求,这将会非常浪费时间.别的,假如轮询的隔断时间太长,对处理新恳求,还会造成延时;假如隔断太短,那么线程在轮询上耗费的时间又太多.那么,为什么不让假脱机程序有两个线程呢?一个用于将打印工作传送到打印机,而另一个用于处于用户的恳求,它们之间都彼此独立运行;而当一个线程工作完成时,它要末完毕自身,要末进入休眠状况.
当处理并发的履行线程时,必必要首先理解两个重要的概念:原子性和重入性.一个原子变量或对象是作为一个整体被拜候的,乃至于在异步操作的情形下也是如此--拜候的是同一个变量或对象.举例来说,假如一个线程正在更新一个原子变量或对象,而另一个线程在读取其内容,此时来说,内容逻辑上的完好性是不大概被破坏的,所以,要末读取到旧值,要末读取到新值,而不会旧值新值各读一部份.普通来说,能被原子性拜候的变量或对象,只是那些在硬件上能被原子性支持的范例,如字节(Byte)和字(Word).C++/CLI中大大都的基本范例都确保具有原子性,剩下的范例也可被某种特定的实现支持原子性,但不能百分百保证.显而易见,一个实现了x与y坐标对的Point对象,不具有原子性,对Point值的写入,大概会被对其值的读取中止,后果就是,读取到了一个新的x值和一个旧的y值,反之亦然;一样地,数组也不大概被原子性地拜候.恰是因为大大都的对象不能被原子性地拜候,所以必须利用一些同步情势来保证在某一时间,只有一个线程可操作某个特定的对象.也恰是因为此,C++/CLI分配给每一个对象、数据和类一个同步锁.
以上是“实例解析C++/CLI线程之多任务[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |