我在 Windows 7 机器上使用 Visual Studio 2010 和 OpenMP。我编写了以下代码片段:
#pragma omp parallel for
for(int jj=0;jj<2;jj++){
MSG msg;
// do something in parallel for jj
int i_loopcounter = 0;
bool b_continue = true;
while(GetMessage(&msg, NULL, 0, 0)&&b_continue){
TranslateMessage(&msg);
DispatchMessage(&msg);
i_loopcounter++;
if(i_loopcounter==50){
b_continue = false;
//abort(); <- ugly, since a window appears
//exit(0); <- rest of the code is not executed
//break; <- not allowed
//goto end; <- not allowed
}
}
end:;
// do some other stuff in parallel for jj
} //end of parallel for
我的问题是:
如果我使用该b_continue
变量,第一个达到中止条件的 while 循环会导致程序挂起(这是一个竞争条件,我没有看到吗?),结果程序不执行其余的代码。
那么我怎样才能让它工作呢?
我已经尝试了在 openmp 中打破结构化块时建议的解决方案,但这并没有改变这种情况。
需要自毁的 while 循环来触发从硬件下载文件。完成后,程序应该对该文件做一些工作。在我开始并行化代码之前,它使用 while 循环中的 break 语句运行良好。
感谢您的任何评论,这给了我解决此问题的提示。
更新:我现在将代码更改为
int i_loopcounter = 0;
while(_i_NoDownloads!=2){
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
i_loopcounter++;
if(_b_control){
cout<<i_loopcounter <<" of Thread "<<omp_get_thread_num()<<endl;
}
}
全局变量_i_NoDownloads
计算下载文件的数量,如果达到 2 则不再需要消息循环。然而,即使进行了这种更改,程序的行为也不会改变,尽管 while 循环现在不一定是 50 次迭代。我认为问题在于同时破坏消息循环。
更新 2:在阅读了很多关于 Windows 消息的概念之后,我找到了一个可行的解决方案。并行部分没有完成的原因是 GetMessage 的行为。
再次,非常感谢为这个问题做出贡献的任何人。
干杯 TL