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

       在进行多线程编程时,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;
				}
			}
		}
	}
}

从代码中可以看到,先用了临界区,代替线程挂起的操作,而后,用一个外部BOOL变量,用来进行判断,如果下面的条件满足,则改变这个变量的值,其他线程执行时,发现这个变量变化,则不进行任何操作,都continue过去,这样虽然没有直接退出线程,但是起到的效果相当,在使用OpenMP时,目前这也是最好的办法。


你可能感兴趣的:(多线程,异常处理,线程中断,openmp)