在 C++/CLI 中并行执行程序

Posted

技术标签:

【中文标题】在 C++/CLI 中并行执行程序【英文标题】:Parallel execution of program within C++/CLI 【发布时间】:2016-03-18 01:35:45 【问题描述】:

我正在编写一个 Windows 窗体程序 (C++/CLI),它在一个大的“for”循环中多次调用可执行程序。我想并行调用可执行文件,因为运行一次最多需要一分钟。

windows窗体代码的关键部分是大的for循环(实际上是2个循环):

for (int a=0; a<1000; a++)
   for (int b=0; b<100; b++)
       int run = a*100 + b;
       char startstr[50], configstr[50]; strcpy(startstr, "solver.exe");
       sprintf(configstr, " %d %d %d", run, a, b);
       strcat(startstr, configstr);
       CreateProcessA(NULL, startstr,......) ;
   

solver.exe 程序使用整数“run”、“a”和“b”。 “运行”用于从每个程序运行中写入一个唯一的输出文本文件。 “a”和“b”是用于读取特定输入文本文件的数字。这些并不是每次运行所独有的。

在每次调用“CreateProcess”后等待,因为我希望这些并行执行。

目前我的代码正在运行并且似乎可以正常工作。但是,它会同时处理大量solver.exe 程序实例,导致我的计算机变得非常缓慢,直到一切都完成。

我的问题是,如何创建一个队列来限制并发进程的数量(例如机器上的物理内核数量),以便它们不会都尝试同时运行?当 for 循环设置得更大时,内存也可能是一个问题。

第二个问题是,solver.exe 的不同实例潜在的并发文件读取是否会产生问题? (我可以解决这个问题,但如果我不需要,我不想这样做。)

我熟悉 openmp 和 C,但这是我第一次尝试在 Windows 窗体程序中运行并行进程。

谢谢

【问题讨论】:

这必须是单独的 .exe 吗?如果您控制求解器代码,如果它是一个 DLL,它会更容易。 "solver.exe 的不同实例读取潜在的并发文件会产生问题吗?"这取决于 - 如果它只是在读取,那么只要确保不以任何方式锁定文件就可以了。 无论如何,这可能是重复的。看看这个,看看它是否符合您的需求:***.com/questions/42531/… 题外话:使用std::stringstream 可以省去很多麻烦。 std::stringstream startstr; startstr &lt;&lt;"solver.exe "&lt;&lt; run &lt;&lt; ' ' &lt;&lt; a &lt;&lt; ' ' &lt;&lt; b; CreateProcessA(NULL, startstr.str().c_str(),......) ; 是的,文件只是读取而不是写入。 【参考方案1】:

我已经成功地使用 OpenMP 函数“parallel for”来并行运行外部循环,并使用函数 omp_set_num_threads() 来设置并发进程的数量。正如建议的那样,并发文件读取没有对我的系统造成任何问题。

【讨论】:

以上是关于在 C++/CLI 中并行执行程序的主要内容,如果未能解决你的问题,请参考以下文章

C语言多线程

简单的PowerShell并行命令执行

如何与opengl并行运行程序[关闭]

在包中并行执行程序[重复]

并行执行 oracle SQL 语句的最佳方法

testng多线程并行执行测试