有人可以向我解释线程吗?[已关闭]
我一直在考虑向我的应用程序添加线程过程以加快执行速度,但问题是老实说,我不知道如何使用线程,或者什么被认为是“线程安全”。例如,游戏引擎如何在其渲染过程中利用线程,或者在什么上下文中线程仅被视为障碍?有人可以指出一些资源来帮助我了解更多信息或在这里解释吗?
我一直在考虑向我的应用程序添加线程过程以加快执行速度,但问题是老实说,我不知道如何使用线程,或者什么被认为是“线程安全”。例如,游戏引擎如何在其渲染过程中利用线程,或者在什么上下文中线程仅被视为障碍?有人可以指出一些资源来帮助我了解更多信息或在这里解释吗?
这是一个非常广泛的话题。但是,如果我对线程一无所知,我想知道以下几点:
它们是“并行”发生的单个进程中的执行单元 - 这意味着处理器中的当前执行单元会快速切换。这可以通过不同的方式实现。切换称为“上下文切换”,并且存在一些与此相关的开销。
他们可以分享记忆!这是可能发生问题的地方。我在后面的要点中更深入地讨论了这一点。
并行化应用程序的好处是,使用计算机不同部分的逻辑可以同时发生。也就是说,如果进程的一部分是 I/O 密集型的,而部分进程是 CPU 密集型的,则 I/O 密集型操作不必等到 CPU 密集型操作完成。如果您拥有多核处理器,某些语言还允许您同时运行线程(因此也并行化 CPU 密集型操作),尽管情况并非总是如此。
线程安全意味着没有争用条件,该术语用于表示当进程的执行依赖于时序(您不想依赖时序)时发生的问题。例如,如果您有线程并且两者都递增共享计数器,则可以看到读取 的值,然后读取 的值,然后用 覆盖,然后用 覆盖。请注意,实际上只递增一次!A
B
C
A
C
B
C
A
C
C+1
B
C
C+1
C
避免争用条件的几种常见方法包括同步,它排除了对共享状态的相互访问,或者只是根本没有任何共享状态。但这只是冰山一角 - 线程安全是一个相当广泛的话题。
我希望这有帮助!要知道,这是对需要大量学习的东西的非常快速的介绍。我建议用你喜欢的语言找到一个关于多线程的资源,不管那是什么,并彻底阅读它。
关于线程,您应该了解四件事。
线程类似于进程,但它们共享内存。
线程通常具有硬件、操作系统和语言支持,这可能使它们比进程更好。
线程需要支持许多挑剔的小东西(如锁和信号量),这样它们就不会让它们共享的内存进入不一致的状态。这使得它们有点难以使用。
锁定不是自动的(在我所知道的语言中),所以你必须非常小心它们(隐式地)共享的内存。