gpt4 book ai didi

C++ OpenMP exit while loop inside a parallel for

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:47 28 4
gpt4 key购买 nike

我在 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 循环会导致程序挂起(这是竞争条件吗,我没看到?),如结果程序不执行其余代码。

那么我怎样才能让它工作呢?

我已经尝试了 breaking out of structured block in 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

最佳答案

关于C++ OpenMP exit while loop inside a parallel for,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16436266/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com