5

我在 Windows 上有两个用 C++ 编写的可执行文件。我在一个中生成了一些数据,并想调用另一个可执行文件来处理这些数据。我可以将数据写入一个文件,然后在另一个可执行文件中读取它,但这在磁盘 I/O 方面似乎相当昂贵。有什么更好的方法来做到这一点?这似乎是一个足够简单的问题,但谷歌只是没有帮助!

假设数据大约为 100MB,并且在需要发送之前完整生成(即不需要流式传输)。

混合 32 位和 64 位进程时有效的答案会获得加分。

4

3 回答 3

5

如果您的进程可以轻松地写入和读取文件,请继续。创建文件CreateFile并将其标记为临时和可共享。Windows 使用此提示来延迟物理写入,但仍遵守所有文件语义。由于您的文件只有 100 MB 并且正在使用中,Windows 几乎可以肯定能够将其内容完全保存在 RAM 中。

于 2013-02-07T14:26:31.390 回答
3

您可以使用Boost.MPI。它来自具有高质量标准的 Boost,代码示例看起来非常明确:

http://www.boost.org/doc/libs/1_53_0/doc/html/mpi/tutorial.html#mpi.point_to_point

// The following program uses two MPI processes to write "Hello, world!"
// to the screen (hello_world.cpp):

int main(int argc, char* argv[])
{
  mpi::environment env(argc, argv);
  mpi::communicator world;

  if (world.rank() == 0) {
    world.send(1, 0, std::string("Hello"));
    std::string msg;
    world.recv(1, 1, msg);
    std::cout << msg << "!" << std::endl;
  } else {
    std::string msg;
    world.recv(0, 0, msg);
    std::cout << msg << ", ";
    std::cout.flush();
    world.send(0, 1, std::string("world"));
  }
  return 0;
}
于 2013-02-07T12:25:58.567 回答
1

假设您只想走“一个方向”(也就是说,您不需要从子进程获取数据),您可以使用_popen(). 您将数据写入管道,子进程从中读取数据stdin

如果您需要双向数据流,那么您将需要使用两个管道,一个作为输入,一个作为输出,并且您需要设置子进程如何连接到这些管道的方案 [您仍然可以设置stdin/stdout 作为数据路径,但您也可以使用一对命名管道]。

第三种选择是共享内存区域。我从未在 Windows 中这样做过,但原理与我在 Linux [以及多年前在 OS/2 中使用的原理几乎相同]: 1. 在父进程中创建一个具有给定名称的内存区域. 2.子进程打开同一个内存区域。3. 数据由父进程存储,由子进程读取。4. 如有必要,可以使用信号量或类似信号来表示完成/结果就绪/等。

于 2013-02-07T12:28:15.957 回答