使用OpenMP进行多线程处理时,如何退出多线程

在进行多线程编程时,OpenMP是个非常有效的工具,它能最大化的将你的并行处理发挥到极致。当然有如此便利的方面,自然也会有相应的限制条件。但是一旦熟悉使用,注意它的那几个原则,也不会有什么问题。

在最近的工作中,遇到了一种情况,内容如下:在多线程循环中进行并行处理数据,但是当其中一个线程中的一组数据满足于一个特定的条件时,需要将所有线程挂起,并且弹出提示框,并根据用户在提示框中的选择进行下一步操作,其中一步操作就是退出整个多线程,进行下一步工作。

这些要求,在使用API多线程函数进行操作时,不难完成,有相对应的函数。但是在使用OpenMP时,却没有这样的函数,并且在循环内部不允许有能够到达循环之外的跳转语句,同时也不允许有外部的跳转语句到达循环内部。goto 和break的跳转范围必须在循环内部,异常处理也必须在循环内部处理,甚至直接reture也不行。在网络查找资料和自己实验,总结如下:

OpenMP是不支持线程中断的,一旦开启,必须执行完毕!

既然不支持,但如果还要实现我的那种要求,该怎么办呢?只有换个思路,更改一下实现方法。

原计划这样实现:

#pragma omp parallel forfor(int i=0; i<nCount; i++){if (i==?){break;}}但是迫于无奈,,只能这样实现:BOOL bGotoNext = FALSE;#pragma omp parallel forfor(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;}}}}}从代码中可以看到,先用了临界区,代替线程挂起的操作,而后,用一个外部BOOL变量,用来进行判断,如果下面的条件满足,则改变这个变量的值,其他线程执行时,发现这个变量变化,则不进行任何操作,都continue过去,这样虽然没有直接退出线程,但是起到的效果相当,在使用OpenMP时,目前这也是最好的办法。

夺冠那一刻,豪情万丈!登顶那一瞬,万众瞩目!那一刻的嫣然一笑,

使用OpenMP进行多线程处理时,如何退出多线程

相关文章:

你感兴趣的文章:

标签云: