办公室的一些研究员认为,当他们在代码中添加线程时,windows会将这些线程分配给在多核或多处理器机器的不同处理器上运行。然后,当没有发生这种情况时,一切都归咎于这些线程的存在在所述多核或多处理器机器上彼此冲突。
有人会揭穿或证实这个概念吗?
答案 0 :(得分:6)
当应用程序生成多个线程时,它们确实可以分配给不同的处理器。实际上,不正确的多线程代码在单处理器计算机上运行正常但在多处理器计算机上显示问题的情况并不少见。 (如果代码在时间切片面前是安全的,但在面对真正的并发性时破坏了,就会发生这种情况。)
答案 1 :(得分:2)
通常每个CPU最多只能有1个线程,但除非你的应用程序对一个处理器有一些明确的线程关联,否则Windows会将这些线程分配给一个免费的处理器。
答案 2 :(得分:2)
是的,线程和多线程几乎与机器中的cpus或核心数无关......
编辑附加:谈论“在cpu上运行多少个线程”是矛盾的。只有一个线程可以在单个CPU上运行。多线程是关于PROCESS中的多个线程,而不是CPU。在另一个线程可以在任何CPU上运行之前,当前在该CPU上的线程必须停止运行,并且它的状态必须保留在某处,以便操作系统可以在它接下来“转”时重新启动它。
代码在“进程”中运行,“进程”是可以运行一个或多个代码指令序列的逻辑抽象,并且独立于其他进程管理计算机资源。在一个过程中,每个单独的代码指令序列都是“线程”。他们运行的cpu是无关紧要的。单个线程可以在不同的cpu上运行,每次分配一个cpu来运行...而多个线程,因为它们每个都分配了cpu周期,巧合的是,可以在同一个cpu上运行(虽然显然不是同时的)
操作系统(操作系统的一个组件)负责“运行”线程。它保留了所有线程的内存列表,并且不断地“切换”(它称为上下文切换)。它在单个CPU机器中执行此操作的方式与在多CPU机器中完全相同。即使在多个Cpu机器中,每次它“打开”一个线程,它可能会将它送到不同的CPU或同一个CPU,就像上次一样。
答案 3 :(得分:2)
如果计算机有多个处理器,Windows将自动在不同的处理器上执行多个线程。如果您在单处理器计算机上运行,则线程是时间分片的,但是当您将进程移动到多处理器计算机时,该进程将自动利用多个处理器。
因为代码同时运行,所以线程可能更有可能在多核机器上踩到彼此脚趾然后在单个核心机器上,因为两个线程可能同时写入共享位置而不是如果线程交换的时间恰到好处,就会发生这种情况。
答案 4 :(得分:0)
无法保证将进程的线程分配为在不同的CPU上运行。