同时运行两个线程

use*_*819 24 parallel-processing multithreading

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

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

ryy*_*ker 45

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

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

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

与C中的线程相关的链接:
SO示例
POSIX
ANSI C.

并行处理:
当在多核系统(多个uP或多个多核uP)上发生多线程程序时,线程可以并发或并行运行,因为不同的线程可能被分离以分离核心以共享工作负载.这是并行处理的一个示例.

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

与C中并行处理相关的链接:
OpenMP
更多OpenMP(示例)
Gribble实验室 - OpenMP
CUDA简介从NVIDIA开始

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

这种线程和体系结构的总结几乎没有触及表面.该主题有很多部分.解决这些问题的书籍将填补一个小型图书馆,并且有数千个链接.毫不奇怪,在更广泛的主题中,一些概念似乎并不合理.例如,仅仅拥有更多内核将导致更快的多线程程序.


Seg*_*ult 7

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

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

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

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

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