有人能解释一下线程吗?
我一直在考虑给我的应用程序添加多线程功能,以加快执行速度,但老实说,我对如何使用线程或者什么是“线程安全”一点都不了解。比如,一个游戏引擎是如何在渲染过程中使用线程的?在什么情况下,线程反而会成为一种障碍?有没有人能给我推荐一些资源,帮助我更深入地了解这些,或者在这里解释一下?
10 个回答
Orm,这是个很好的问题。我觉得所有认真的程序员都应该了解线程,因为最终你一定会考虑使用它们,而你真的希望在那时做好准备。并发错误可能非常微妙,避免这些错误的最好方法就是知道哪些用法是相对安全的。
我强烈建议你花时间阅读Doug Lea的书《Java并发编程:设计原则与模式》: http://gee.cs.oswego.edu/dl/cpj/
Lea不仅花时间教你这些概念,还会展示如何正确和错误地使用并发编程的基本工具(虽然是用Java讲的,但对任何使用共享内存锁定/信号的环境也很有帮助)。最重要的是,他教会你要尊重并发编程的复杂性。
我还要补充一点,这种并发编程的方式是最常见的,但并不是唯一的方法。还有一种消息传递的方式,这种方式更安全,但会迫使你以不同的方式来构建你的算法。
关于线程,有四件事你需要知道。
线程就像进程,但它们可以共享内存。
线程通常有硬件、操作系统和编程语言的支持,这可能让它们比进程更好用。
线程需要处理很多小问题(比如锁和信号量),以确保它们共享的内存不会变得混乱。这让使用线程变得有点复杂。
锁的使用不是自动的(在我知道的编程语言中),所以你必须非常小心它们(隐含地)共享的内存。
这个话题很广泛。不过,如果我对线程一无所知,这里有一些我想了解的内容:
线程是一个进程内部的执行单元,它们可以“并行”运行。简单来说,就是处理器在执行不同的任务时会快速切换。这个切换过程叫做“上下文切换”,而且这个过程会消耗一些资源。
线程可以共享内存!这也是问题可能出现的地方。我会在后面的要点中详细讲讲这个。
将应用程序并行化的好处在于,使用机器不同部分的逻辑可以同时进行。也就是说,如果你的某个过程是输入输出密集型,而另一个是CPU密集型,那么输入输出操作就不需要等到CPU操作完成后才能进行。有些编程语言允许你在多核处理器上同时运行线程,这样也能并行处理CPU密集型的操作,但并不是所有情况下都能这样。
线程安全意味着没有“竞争条件”,这是指当你的进程执行依赖于时间时可能出现的问题(这种情况你是希望避免的)。举个例子,如果有线程
A
和B
都在增加一个共享计数器C
,可能会出现这样的情况:A
先读取了C
的值,然后B
也读取了C
的值,接着A
把C
的值更新为C+1
,最后B
又把C
的值更新为C+1
。注意,这样C
实际上只增加了一次!避免竞争条件的常见方法有“同步”,这意味着在访问共享状态时互相排斥,或者根本不共享状态。但这只是冰山一角,线程安全是一个相当广泛的话题。
希望这些对你有帮助!要明白,这只是一个非常快速的介绍,实际上这个主题需要学习的内容还很多。我建议你找一些关于你喜欢的编程语言的多线程资源,仔细阅读一下。