如何从一开始就启动具有多个线程的进程?

How to start a process with multiple threads right from the beginning?

提问人:Sourav Kannantha B 提问时间:8/4/2022 更新时间:8/4/2022 访问量:370

问:

据我所知,进程是它托管的所有线程的公共容器。如果多个线程在同一进程中运行,则它们可以轻松共享资源。进程中的所有线程共享一个公共地址空间。另一方面,线程是程序的执行单元。

操作系统中的调度程序调度线程,而不是进程 (1)。如果进程的任何一个线程正在运行,则称该进程正在活动运行。否则,该过程正在等待。调度程序不能简单地调度进程。

此外,除了优先级之外,从操作系统的角度来看,进程中的所有线程都是平等的,即使是主线程 (2)(某些应用程序可能为每个线程分配了特定于应用程序的角色,我在这里忽略了这一点)。

基于(1)和(2),似乎没有要求所有进程都应该从一个线程开始,然后应该根据需要生成子线程。因此,从技术上讲,可以从一开始就启动具有多个线程的进程,其中没有一个线程启动另一个线程。当该过程启动时,调度程序可以简单地调度许多起始线程中的任何一个。但我不明白该怎么做!

那么,如何从一开始就启动一个具有多个线程的进程呢?这个问题不涉及任何特定的操作系统。此外,如果强制作为入口点的编程语言在举例时是一个问题,我可以(或尝试)理解 x86-64 汇编代码。main

多线程进程 与语言无关 概念 平台

评论

0赞 Jérôme Richard 8/5/2022
AFAIK 这是不可能的。在 Linux 上,然后完成分叉,复制完整的目标进程,包括所有线程。但是,只剩下执行分叉调用的线程:在新进程的分叉之后,所有其他线程(不知何故)都会被杀死。在 Windows 上,AFAIK,需要在进程启动期间手动创建线程。问题是为什么你甚至需要它:在 main 函数中创建线程有什么问题?
0赞 Jérôme Richard 8/5/2022
(1)不完全正确。在 Linux 上,调度程序调度的任务理论上可以是进程,但实际上它通常是线程。(2)线程模型错误。例如,在 C++ 中,主线程是特殊的,因为如果它被杀死,那么所有应用程序都会被杀死。对于其他线程(通常联接),情况并非如此。主线程可以看作是 init 进程,但用于 1 个应用程序而不是整个系统(即,如果 init 被杀死,那么一切都被杀死)。请注意,这种行为在 D 等语言中并非如此。
0赞 Sourav Kannantha B 8/5/2022
@JérômeRichard (2) 我认为你对主线程C++只有部分正确。在 C 和 C++ 中,当主线程返回时,它会隐式调用 .这就是为什么整个过程被扼杀的原因。任何调用的线程都会杀死整个进程,主线程没什么特别的。如果要终止主线程,并且仍然保持进程运行,请在从 返回之前执行此操作,这样就不会调用隐式。下面是一个示例exit()exit()pthread_exit()mainexit()
0赞 Sourav Kannantha B 8/5/2022
(1) 这似乎是 Linux 特有的实现细节。Windows 实际上可以在启动时从线程池创建更多线程。但我不知道如何访问它们并自定义它们。关于我为什么需要它,我实际上并不“需要”它。我只是好奇是否有某种可能的方法。
1赞 Jerry Coffin 8/9/2022
简短的回答:虽然可以编写操作系统来支持您所要求的内容,但当前的操作系统(至少我知道所有这些操作系统)根本不支持它。在当前的操作系统下,每个进程只从一个线程开始,如果你想要更多的线程,你可以让该线程根据需要生成其他线程。

答: 暂无答案