太细, 则任务间通信的数量急剧增多,得不偿失。因此,所有的现代操作系统都支持把多进程的任务细分到多线程来执行。线程跟进程一样, 独立运行。没有线程知晓其他线程正在运行什么, 也不知道它们在程序中的位置, 除非进行显式的同步措施。进程和线程的主要区别在于同一进程的所有线程共享该进程的所有资源。很明显, 这让工作变得更快速。因为线程间上下文切换更快, 而且可以在同一地址空间内访问内存。二、线程编程一旦我们开始使用线程来编程, 很多问题便接踵而来。我们应当如何划分及分配任务以便保持每个可用处理器核心忙碌?我们是否应当在每次拥有新任务时创建一个新线程, 还是创建并管理一个线程池?线程数量应当依赖于处理器核心数量吗?线程处理完任务后, 应当再干些什么? 这些都是实现多任务很重要的问题。但我们并不需要过多担心, Microsoft 为此做了大量的研究工作。诚如当年的汇编语言开发人员不得不考虑内存分配, 内存布局, 堆栈指针, 寄存器分配等细节,而 C/C++ 则依靠编译器和库抽象隔离了这种细节。到了现今的 Java/.NET 开发人员通过 VM 和 GC 已经不再考虑此问题。 Microsoft 的.NET 并行扩展库正试图让开发人员远离线程管理,站在一个更高的抽象层次上,从而直接利用并行。三、线程安全当编写的代码在并行/ 并发运行时会引发问题,那就不能说是线程安全的。单线程程序仅包含一个控制流, 所以也就无所谓线程安全。但在多线程程序中, 同一个函数和资源或许被多个控制流并发使用。因此,为多线程编写的代码必须要线程安全。任何变量状态在被请求写入时都要确保线程安全。一般来说, 我们会使用互斥来确保此刻只有一个线程执行代码, 而把所有其他线程排斥在外。当然还要使用线程安全的库。如果你要使用某个库中的函数, 请检查文档, 看是否有线程安全的版本。比如, .NET 的泛型集合类均非线程安全。