在进行多线程编程时,OpenMP是个非常有效的工具,它能最大化的将你的并行处理发挥到极致。当然有如此便利的方面,自然也会有相应的限制条件。但是一旦熟悉使用,注意它的那几个原则,也不会有什么问题。
在最近的工作中,遇到了一种情况,内容如下:在多线程循环中进行并行处理数据,但是当其中一个线程中的一组数据满足于一个特定的条件时,需要将所有线程挂起,并且弹出提示框,并根据用户在提示框中的选择进行下一步操作,其中一步操作就是退出整个多线程,进行下一步工作。
这些要求,在使用API多线程函数进行操作时,不难完成,有相对应的函数。但是在使用OpenMP时,却没有这样的函数,并且在循环内部不允许有能够到达循环之外的跳转语句,同时也不允许有外部的跳转语句到达循环内部。goto 和break的跳转范围必须在循环内部,异常处理也必须在循环内部处理,甚至直接reture也不行。在网络查找资料和自己实验,总结如下:
OpenMP是不支持线程中断的,一旦开启,必须执行完毕!
既然不支持,但如果还要实现我的那种要求,该怎么办呢?只有换个思路,更改一下实现方法。
原计划这样实现:
#pragma omp parallel for for(int i=0; i<nCount; i++) { if (i==?) { break; } }
BOOL bGotoNext = FALSE; #pragma omp parallel for for(int i=0; i<nCount; i++) { //如果下面中有操作认为不需要进行循环判断 if (bGotoNext==TRUE) { continue; } if (i==?) { #pragma omp critical { if (bGotoNext==FALSE) { CString strInfo; strInfo.Format("是否继续判断余下操作?"); if (IDYES!=MessageBox(strInfo,MB_YESNO)) { bGotoNext = TRUE; } } } } }
原文地址:http://blog.csdn.net/guoguojune/article/details/43526951