关于多线程

时间:2014-08-22 15:50:36

标签: multithreading multicore

据我所知,阅读有关线程的大量信息,如今,如果你有一个unicore处理器,你的所有程序都会在不同的线程中分段,以便能够同时执行它们。

例如,如果您有3个内核并且只运行一个应用程序,那么当我查看有关此程序执行的信息时,我得到的结果如下: 线程1:做到了这一点 线程2:这个 线程2:这个 线程3:这个 线程1:这个 线程3:这个 线程1:这个 ...

所有相同数量的线程是否相关?或者它们是应用程序的完全独立部分?

非常感谢。

2 个答案:

答案 0 :(得分:1)

  

据我所知,阅读有关线程的大量信息,如今,如果你有一个unicore处理器,你的所有程序都会在不同的线程中分段,以便能够同时执行它们。

如果程序明确设计为执行此操作(或者如果它使用更高级别的机制来调度并发工作负载,则程序仅执行多个线程的工作,在这种情况下,线程调度仍然存在,但是抽象出来)。无论您是否有一个或多个可用的CPU /核心,都是如此。

每个CPU一次可以运行一个“线程”,因此如果您有多个CPU /核心,那么您可以并行运行多个线程。如果线程数多于CPU,则必须轮流执行。执行顺序由调度程序确定,但通常一个线程将运行一段称为量子的短时间。它可以随时自愿产生其余的量子,或者它可以继续运行,直到调度程序决定另一个线程运行的时间。如果您只有一个CPU,则在任何给定时间只执行一个线程 - 它们并非真正同时运行;相反,它们正在以一种创造并发幻觉的方式交织在一起。

  

例如,如果你有3个内核并且你只运行一个应用程序,当我查看有关此程序执行的信息时,我会得到类似的内容:线程1:已完成此线程2:此线程2:此线程3:此线程1:这个线程3:这个线程1:这......

有关线程的文献中,您通常可以假设线程标识符引用唯一线程。在实践中,事情并不那么明确,你不能对这些ID做太多假设。

关于线程要记住的一个重要事项是它们主要是概念性的。线程库通常只是在另一个调度层之上实现的调度抽象。如果您使用的线程库为每个线程提供唯一的数字ID,您通常可以假设ID将始终引用该库中当前进程的相同概念线程,至少直到线程终止。在当前进程之外,该ID可能毫无意义,即使在进程内,如果线程终止,也可以稍后使用相同的ID创建另一个线程。

给定的编程语言/运行时可能会公开自己的线程API,但它提供的线程可能没有与操作系统管理的内核级线程的一对一映射。由线程库提供的线程可能在其整个生命周期内最终在一个或多个不同的内核线程上执行,并且虽然其线程ID可能保持不变,但它可能与它所在的内核线程的ID没有任何关系。界。在你的过程中,这并不重要。但是,如果您与其他进程交谈,或与引用线程的OS级API进行交互,则需要注意这种不匹配。如果在同一个应用程序中使用不同的线程库,情况也是如此。

答案 1 :(得分:0)

不能在同一个线程中运行两个进程。这意味着代码注入,因此它们成为单个进程。相反,它们可以在相同的核心上运行,但具有不同的线程。