C++ ITC比同类IPC快吗?

C++ ITC比同类IPC快吗?,c++,multithreading,performance,multiprocessing,C++,Multithreading,Performance,Multiprocessing,我试图找出线程间和进程间通信之间是否存在固有的速度差异 我知道当使用线程时,线程共享相同的内存,可以使用相同的全局变量,而进程必须使用其他技巧,这基本上意味着队列 但以以下情况为例: 一个应用程序由几个完全独立的.exe文件组成。当所有这些都运行时,它们形成生产者/消费者(或发行者/订阅者)体系结构,其中一些进程产生一些值,而其他进程读取并使用这些值,可能产生一些其他值 这种通信是通过IPC的常规方式完成的 我的问题是:如果我移动代码,使其成为一个具有多个线程的进程(假设与变量名等没有冲突),但

我试图找出线程间和进程间通信之间是否存在固有的速度差异

我知道当使用线程时,线程共享相同的内存,可以使用相同的全局变量,而进程必须使用其他技巧,这基本上意味着队列

但以以下情况为例:

一个应用程序由几个完全独立的
.exe
文件组成。当所有这些都运行时,它们形成生产者/消费者(或发行者/订阅者)体系结构,其中一些进程产生一些值,而其他进程读取并使用这些值,可能产生一些其他值

这种通信是通过IPC的常规方式完成的

我的问题是:如果我移动代码,使其成为一个具有多个线程的进程(假设与变量名等没有冲突),但保持通信方法不变,队列后面有所有锁和信号量,那么基于线程的应用程序会比基于进程的应用程序更快吗

进程与线程的启动成本并不重要,因为应用程序要运行很长时间(小时),所以几毫秒并不重要

谷歌对此没有得出结论性的答案

要澄清问题的某些方面:

  • 我想最大化的因素是吞吐量

    某些外部因素(例如arduino传感器)会为其中一个节点生成输入,而整个网络需要一些时间,而所有节点都会消耗和生成值。然后可以处理新的输入。我希望每分钟/秒能够处理更多的输入

  • 来回传递的数据大多是数字或小的数字数组

  • 整个网络可以有5到25个节点

  • 至于平台(如果相关的话),我想要Linux和Windows的答案

  • <> >具体用例太大,这里无法描述,所以请考虑上面提供的用例。就我个人而言,这是一个教育问题,如果不是更多的话,也是一个关于具体问题的问题

    请询问我在此未包含的任何其他相关信息

    如果我移动代码,使其成为一个具有多个线程的进程(假设与变量名等没有冲突),但保持通信方法不变,队列后面有所有锁和信号量,那么基于线程的应用程序会比基于进程的应用程序快吗

    这是不可能的。多线程版本将利用共享内存空间,而多进程版本不能这样做。例如,您可以在一个线程中获取一个普通对象,并通过另一个线程中的指针访问它,所有引用的子对象都将“正常工作”。任何未修改的内容都可以在一个线程和另一个线程中轻松访问,无需特别努力


    这根本不适用于所有进程,因为它们不共享地址空间。

    您已经这样做了至少两次,但仍然没有关注问题。事实上,据我所知,它们几乎一模一样。你是否希望每次对你的问题都有不同的回答?1)“如果我将代码移到其他地方…”是一个宽泛的说法。有许多不同的方法可以做到这一点,甚至在您稍后列举的约束条件内,答案将取决于所有这些条件。“特定用例太大,此处无法描述……”是有问题的;我们需要看到具体的用例,以了解如何解决这个问题。否则,我们只能猜测所有可能的场景以及它们如何影响性能。试着做一个你所指内容的小演示,这可能会使问题足够集中。2)关于重新发布相同的问题:请不要这样做。取而代之的是,通过整合你得到的反馈来编辑原始问题。如果你重新发布这个问题,特别是没有链接到以前的版本,那么所有已经提出的建议的上下文都会丢失,你基本上希望用户重复别人已经做过的工作,这是不受欢迎的。这个问题是关于从IPC转移到ITC。线程比进程有更多的可能性,但当向另一个方向移动时,您可能能够保持相同的通信方法(例如,队列或管道)。我的问题是,当使用相同的沟通方法时,表现会有什么不同。但它们不是“相同的沟通方法”。进程之间的队列不能利用共享地址空间。线程之间的队列可能会发生冲突。线程之间的管道可以使用共享地址空间和线程间锁。进程之间的管道不能。