在C 程序中并行化C代码模块

Parallelizing C-Code Module in C++ Program

本文关键字:代码 模块 并行化 程序      更新时间:2023-10-16

我的情况:我在微控制器上运行C代码。为了测试此代码,我在C 中编写了一个检查C函数的测试程序。由于测试功能非常慢,所以我想并行完成整个事情。但是,我没有太多的经验。

例如,我有一个看起来像这样的程序模块:

/* c-code: */
static int a=0;
void set_a(int value){
    a = value;
}
void inc_a(void){
    a++;
}
int get_a(void){
return a;
}

现在,我想在C 中并行化这些功能。但是,我对全球变量A感到困扰,这在我的情况下无法避免。在QT环境中,我想执行函数INC_A的"异步运行"。这有效但没有改善:

int foo(int somevalue){
   set_a(somevalue);
   inc_a();
   return get_a();
}
int myinput = 1,myoutput;
QFuture<int> future = QtConcurrent::run(foo,myinput);
future.waitForFinished();
myoutput = future.result();

这就是我想要的:

int myinput1 = 1,myoutput1;
int myinput2 = 8,myoutput2;
QFuture<int> future1 = QtConcurrent::run(foo,myinput1);
QFuture<int> future2 = QtConcurrent::run(foo,myinput2);
future1.waitForFinished();
future2.waitForFinished();
myoutput1 = future1.result();
myoutput2 = future2.result();

所以我的第一个问题是(可以肯定的是):现在两个线程中的变量A(In c)相同吗?如果不是,我必须再次查看我的代码。如果是的,我该如何尽可能优雅地解决问题?我想创建两个具有相同功能的C编程模块。但是,这使该程序非常不友好:

/* c-code: */
static int a1=0;
void set_a1(int value){
    a1 = value;
}
void inc_a1(void){
    a1++;
}
int get_a1(void){
return a1;
}

static int a2=0;
void set_a2(int value){
    a2 = value;
}
void inc_a2(void){
    a2++;
}
int get_a2(void){
return a2;
}

有更好的方法吗?

您不幸。理想情况下,请重写您的可测试资产,以便它围绕着包含所有这些讨厌的全球群体的状态结构,也许您会摆脱它。

vroomfondel还建议,如果可以将代码编译为C ,将有问题的C代码包装在名称空间中可能会隐藏问题。您可以根据需要创建任意数量的名称空间:

 namespace TEST1
 {
    #include "offender.c"
 }
 namespace TEST2
 {
    #include "offender.c"
 }
 RetCode DoTest(int instance, TestId testid)
 {
     switch (instance)
     {
     case 1: return TEST1::DoTest(testid);
     case 2: return TEST2::DoTest(testid);
     }
     return OUT_OF_RANGE;
 }

如果您的目标确实使用了全球状态并且无法更改,则可以考虑使用叉子。

在叉子中,将目前状态的完整副本供孩子跑去,并且他们都恢复了足够的信息,因此您知道哪个是孩子,哪个是所有者。您还可以设置一个管道供他们相互通信。测试完成后,它会传输其状态并退出其分叉过程。

叉子对测试套件真的很有益,因为每个叉子都从一个完全干净的环境开始。

,正确的分叉比我认为合理的答案是一个/lot/更多。

第三个选项是在外部驱动程序,以便某些监视脚本或程序启动多个并行实例,每个实例通过测试列表的子集线性运行。理想情况下构建功能,因此监视器可以按需和负载平衡进行调度测试。