您的位置:首页 > 运维架构

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

2015-02-05 14:13 288 查看
       在进行多线程编程时,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时,目前这也是最好的办法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息