行云

行至水穷处,坐看云起时。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

什么是多线程
多线程涉及到并行做某些事情,就像多进程一样。那么多线程与多进程有什么不同呢?当你正在一个电子表格上做计算的时候,可能在同一个桌面上有一个媒体播放器正在放着你喜欢的歌。这是一个两个进程并行工作的例子。一个进程运行电子表格程序。一个进程运行媒体播放器。这样的场景就是总所周知的多任务。近一步看媒体播放器,我们会发现在一个进程中某些事情正在并行的进行着。当媒体播放器正在发送音乐到声卡驱动时,用户界面也在不断的更新。这就是多线程所做的事情 – 单一进程中的并发性。

并发性是怎么实现的呢?在单核CPU上的并行工作是一种错觉,就像电影不过时移动的图像一样。对于多进程,这种错觉是通过在一段非常短的时间之后中断CPU在某个进程上的工作来实现的。然后CPU运行下一个进程。为了在不同进程之间切换,当前进程的程序计数器被保存起来,下一个CPU程序的计数器被加载进来。当然不仅仅只做这些,因为寄存器和某些架构和系统的特定数据也要被加载和保存。

就像一个CPU可以运行两个或多个进程一样,同样有可能让CPU运行一个单独进程中不同的代码片段。当一个进程启动时,它总是会执行一个代码段,我们就说这个进程有一个线程。然后,这个程序可能决定启动第二个线程。然后,两个不同的代码系列同时在一个进程中被执行。单CPU上的并发性是通过重复的保存程序计数器和寄存器然后加载下一个线程的程序计数器和寄存器来实现的。这些循环不断的切换不需要程序来参与配合(系统完成)。在切换到下一个线程时,上一个线程可能处于任何状态。
目前CPU设计的趋势是多核。一个典型的单线程程序只能利用一个核。然而,多线程程序能够被分配给多个核,真正实现了并发执行。这样,在多核CPU上,把工作分派给多个线程就比只分派给单个线程要运行的更快,因为其它的核可以被利用。

GUI线程和工作线程
上面提到,每一个程序在启动后都有一个线程。这个线程叫做“主线程”(在QT应用程序中称为“GUI线程”)。Qt的GUI必须运行在该线程中。所有的窗体部件和其它相关的类,例如QPixmap,都无法在第二个线程中工作。辅助线程通常称为“工作线程”,因为它通常用来分担主线程的某些处理工作。

开发者需要小心多线程编程。要启动一个线程很容易,但是要保证共享数据的一致性却不容易。

posted on 2013-03-12 16:39  windflying  阅读(286)  评论(0编辑  收藏  举报