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

时间:2015-09-18 15:38:22

标签: c linux multithreading

我不确定标题是否准确地描述了我想要做的事情,但这里有一个问题:

我们有一个庞大且毛茸茸的代码库(这里没有发明 - 由Elbonian Code Slaves提供),它目前编译为一个大二进制文件,内部为各种特定任务创建几个pthread,通过IPC消息进行通信。

由于多种原因,它并不理想,并且有些线程会更好地作为独立的自治过程,因为它们都是个别特定的“工作者”,而不是同一段代码的多个实例。

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

1 个答案:

答案 0 :(得分:2)

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

  1. 而不是调用pthread_create()fork()并在子进程中直接调用thread-start函数(不要使用任何exec-family函数)。

    < / LI>
  2. 将线程执行的代码编译为单独的可执行文件。按标准fork / exec序列启动需要的可执行文件。 (或者您可以使用system()而不是fork / exec,但不要这样做。这样做会不必要地将shell带入其中,同时也会减少对您的控制。)

  3. 前者的缺点是每个过程映像都包含许多永远不会使用的代码,因为每个过程映像都是一切的完整副本。因为在Linux fork()下使用copy-on-write,这主要是地址空间问题,而不是资源浪费问题。

    后者的缺点是主程序需要能够在文件系统上找到子程序。请注意,这不一定是 hard 问题,但它与已经拥有所需代码的情况大不相同。但是,如果有任何方式可以使任何子程序独立有用,那么将它们作为单独的程序分解出来会产生相当大的意义。

    顺便说一下,请注意我一般都不接受这样的前提:将特定的专用工作者作为线程实现是不合适的。但是,如果您想要完成这些任务,那么以上是您可以选择的替代方案。

    已编辑添加:

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

      

    如果多线程进程调用fork(),[...]以避免错误,子进程可能只执行异步信号安全操作,直到调用其中一个exec函数为止。

    另一方面,我非常确定“多线程”的相关定义是该进程在fork()被称为时有多个活动线程。如果子进程在创建任何其他线程之前全部分叉,或者在连接一个线程之后全部分叉,则不应该出现问题。