gpt4 book ai didi

c - 将大型多线程二进制文件拆分为较小的单个进程/二进制文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:19 26 4
gpt4 key购买 nike

我不确定标题是否准确描述了我想做的事情,但问题在于:

我们有一个庞大而多毛的代码库(并非由 Elbonian Code Slaves 提供),目前编译为一个大型二进制文件,它在内部为各种特定任务创建多个 pthread,通过 IPC 消息进行通信。

由于多种原因,这并不理想,并且多个线程作为独立的自治进程会更好,因为它们都是单独的特定“工作人员”,而不是同一段代码的多个实例。

我觉得有点像我错过了一些技巧,这是我们分离各种线程代码并将每个代码编译为使用 system()exec 调用的独立可执行文件的唯一选择() 来自主要的代码块?不知何故感觉笨拙。

最佳答案

如果您想将当前作为线程运行的程序的一部分作为主程序启动的单独进程运行,那么您有两个主要选择:

  1. 不是调用 pthread_create()fork() 而是在子进程中直接调用线程启动函数(不使用任何 exec - 家庭功能)。

  2. 将线程执行的代码编译为单独的可执行文件。通过标准 fork/exec 序列在需要时启动该可执行文件。 (或者您可以使用 system() 而不是 fork/exec,但不要这样做。这样做会不必要地把 shell 带入其中,并且还会给您更少的控制权。)

    <

前者的缺点是每个过程镜像都包含很多它永远不会使用的代码,因为每个过程镜像都是所有内容的完整副本。然而,由于在 Linux fork() 下使用写时复制,这主要是地址空间问题,而不是资源浪费问题。

后者的缺点是主程序需要能够在文件系统上找到子程序。请注意,这不一定是困难 问题,但它与手头已有所需代码有很大不同。但是,如果有任何子程序可以独立使用,那么将它们分解为单独的程序就很有意义。

请注意,顺便说一句,我一般不接受您的前提,即将特定的专用工作线程实现为线程是不合适的。但是,如果您想分解此类任务,那么以上是您可用的替代方案。

编辑添加:

正如@EOF 所指出的,如果您打算在改造之后您的主进程仍然是多线程的(也就是说,如果您打算只将一些线程转换为子进程)那么您需要意识到一个重要的POSIX 设置的限制:

If a multi-threaded process calls fork(), [...] to avoid errors, the child process may only execute async-signal-safe operations until such time as one of the exec functions is called.

另一方面,我很确定“多线程”的相关定义是进程在调用 fork()有多个事件线程。如果在创建任何其他线程之前或在加入一个线程之后所有子进程都被 fork ,这应该不会出现问题。

关于c - 将大型多线程二进制文件拆分为较小的单个进程/二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32655963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com