在C 程序中并行化C代码模块
Parallelizing C-Code Module in C++ Program
我的情况:我在微控制器上运行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/更多。
第三个选项是在外部驱动程序,以便某些监视脚本或程序启动多个并行实例,每个实例通过测试列表的子集线性运行。理想情况下构建功能,因此监视器可以按需和负载平衡进行调度测试。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- Python 3.8:运行外部C++代码:无法导入模块
- 我应该担心动态代码生成与用C++编写的其他模块不匹配吗?
- Python 错误:在 SWIG 生成的C++模板化代码模块中没有定义构造函数
- 在C 程序中并行化C代码模块
- c++运行python代码导入自定义模块
- 我在哪里定义代码来释放在C Python模块init函数中分配的资源
- 尝试在cpp模块中使用汇编程序代码时发生链接器错误
- 模块化意大利面条代码
- Native Client模块是否可以呈现由C++代码生成的HTML
- 为PCL c++代码创建的boost.python模块的导入错误
- Pip安装失败,在fastlz模块上退出代码2 /错误代码1
- 是否有可能在编译c++代码期间报告每个模块的堆栈使用情况?
- 如何在boost:: Python扩展模块中正确组合c++和Python代码
- 用c++编写电源模块代码,收到几个错误