我想知道一个程序是否可以同时运行两个线程(这基本上是正确使用的?)。但是,如果我要在它在线程 A 上运行的一个函数中执行系统调用,并在另一个函数中运行其他一些任务,它在线程 B 上运行,它们是否能够同时运行,还是我的第二个函数等待系统调用完成?
对我原来的问题的补充:现在这个过程在系统调用进行时仍然是一个不可中断的过程吗?我说的是在 UNIX/LINUX 上使用任何系统调用。
请您参考如下方法:
多线程和并行处理是两个完全不同的话题,每个话题都值得讨论,但为了介绍......
线程:
当您启动可执行文件时,它正在进程内的线程中运行。当您启动另一个线程时,将其称为线程 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 .