同时运行两个线程

时间:2013-10-11 17:48:37

标签: multithreading parallel-processing

我想知道程序是否可以同时运行两个线程(基本上它是用于正确的?)。但是,如果我在一个函数中进行系统调用,它在线程A上运行,并且在另一个函数中运行一些其他任务,它在线程B上运行,它们是否能够同时运行或者我的第二个运行功能等到系统调用完成后?

我的原始问题的附加组件:现在,当系统调用正在进行时,此过程仍然是一个不间断的过程吗?我在谈论在UNIX / LINUX上使用任何系统调用。

7 个答案:

答案 0 :(得分:39)

多线程和并行处理是两个完全不同的主题,每个主题都值得自己对话,但为了介绍......

线程
启动可执行文件时,它正在进程中的线程中运行。当您启动另一个线程时,将其称为线程2,您现在在同一进程中有2个单独运行的执行链(线程)。在 single core microprocessor (uP) 上,可以运行多个线程,但不能并行运行。虽然从概念上讲,线程通常被认为是在同时运行,但它们实际上是在由操作系统分配和控制的时间片中连续运行的。这些切片彼此交错。因此,线程1的执行步骤实际上并不与线程2的执行步骤同时发生。这些行为通常扩展到您创建的线程数,即执行链包都在同一进程内工作并共享时间切片由操作系统发出。

因此,在系统调用示例中,它实际上取决于系统调用是关于在允许其他线程的执行步骤继续之前它是否完成。有几个因素会影响将要发生的事情:它是阻塞呼叫吗?一个线程的优先级是否高于另一个。时间片的持续时间是多少?

与C中的线程相关的链接:
SO Example
POSIX
ANSI C

并行处理
当在多核系统(多个uP或多个多核uP)上发生多线程程序时,线程可以并发运行,或者并行运行,因为不同的线程可能被拆分为单独的内核以共享工作量。这是并行处理的一个示例。

同样,从概念上讲,并行处理和线程被认为是相似的,因为它们允许事情同时完成。但这只是概念,它们在目标应用和技术方面确实非常不同。其中线程作为一种在进程中识别和拆分整个任务的方法很有用(例如,TCP / IP服务器可以在请求新连接时启动工作线程,然后连接,并保持该连接,只要它仍然存在),并行处理通常用于发送相同任务的较小组件(例如,可以在不同位置独立执行的一组复杂计算)关闭以分离资源(核心或uP)到同时完成。这是多个核心处理器真正发挥作用的地方。但并行处理还利用了多个系统,这些系统在 genetics MMORPG 游戏等领域很受欢迎。

与C 中的并行处理相关的链接:
OpenMP
More OpenMP (示例)
Gribble Labs - Introduction to OpenMP
CUDA Tookit from NVIDIA

关于线程和架构的一般主题的补充阅读:

这种线程和体系结构的摘要几乎没有触及表面。该主题有很多部分。要解决这些问题的书籍 fill a small library ,并且 thousands of links 。毫不奇怪,在更广泛的主题中,一些概念似乎并不合理。例如, it is not a given that simply having more cores will result in faster multi-threaded programs

答案 1 :(得分:6)

是的,他们至少可能会“同时”运行,这正是线程的用途;当然有很多细节,例如:

  • 如果两个线程都运行系统调用,例如写入相同的文件描述符,它们可能会暂时相互阻塞。

  • 如果使用线程同步原语(如互斥锁),则将阻止并行执行。

  • 您需要一个至少有两个核心的处理器才能让两个线程真正同时运行。

这是一个非常庞大且非常复杂的主题。

答案 2 :(得分:2)

  • 如果您的计算机只有一个CPU,您应该知道它如何同时执行多个线程。

  • 在单处理器系统中,在给定时刻只发生一个执行线程。因为单处理器系统支持逻辑并发,而不支持物理并发。

  • 在多处理器系统上,实际上有几个线程同时执行,并且实现了物理并发。

  • 多线程程序的一个重要特性是它们支持逻辑并发,而不是实际上是否实现了物理并发。

答案 3 :(得分:1)

它们将同时运行,因为一个线程独立于另一个线程,即使您执行系统调用。

测试它很容易,你可以创建一个线程,在控制台输出上打印一些东西,然后在另一个线程上执行系统调用,你知道这需要一些合理的时间。您会注意到其他帖子将继续打印这些消息。

答案 4 :(得分:1)

是的,一个程序可以同时运行两个threads

它被称为Multi threading

  

它们是否能够同时运行,还是我的第二个功能会等到系统调用结束?

他们俩都可以同时跑。


如果需要,可以让线程B等到线程A完成或反转

答案 5 :(得分:1)

基础知识很简单,但细节很快变得复杂。

您可以将程序分解为多个线程(如果这样做有意义),并且每个线程将“按照自己的节奏”运行,这样如果必须等待,例如,某个文件I / O不会不要放慢其他人的速度。

在单个处理器上,通过以某种方式对处理器进行“时间分片”来容纳多个线程 - 或者以简单的时钟为基础,或者让一个线程运行直到它必须等待(例如,用于I / O)然后“切换”到下一个线程。为了最大效率,这样做有一整个艺术/科学。

在多处理器(例如大多数具有2到8个“内核”的现代PC)上,每个线程被分配给一个单独的处理器,如果没有足够的处理器,那么它们将在单处理器的情况下共享

通过单个线程确保操作的“原子性”并确保线程不会以某种方式相互干扰的整个区域非常复杂。通常,系统调用的“内核”或“核心”类别不会被另一个线程中断,但这只是所有系统调用的一小部分,您必须查阅操作系统文档以了解哪个类别特定的系统调用属于。

答案 6 :(得分:0)

只有在多个核心处理器系统上运行时,两个线程才能并发运行,但如果它只有一个核心处理器,则两个线程不能并发运行。因此,一次只运行一个线程,如果它完成了它的工作,那么队列中的下一个线程会占用时间。