使用OpenMP进行多线程处理时,如何退出多线程
2015-02-05 14:13
288 查看
在进行多线程编程时,OpenMP是个非常有效的工具,它能最大化的将你的并行处理发挥到极致。当然有如此便利的方面,自然也会有相应的限制条件。但是一旦熟悉使用,注意它的那几个原则,也不会有什么问题。
在最近的工作中,遇到了一种情况,内容如下:在多线程循环中进行并行处理数据,但是当其中一个线程中的一组数据满足于一个特定的条件时,需要将所有线程挂起,并且弹出提示框,并根据用户在提示框中的选择进行下一步操作,其中一步操作就是退出整个多线程,进行下一步工作。
这些要求,在使用API多线程函数进行操作时,不难完成,有相对应的函数。但是在使用OpenMP时,却没有这样的函数,并且在循环内部不允许有能够到达循环之外的跳转语句,同时也不允许有外部的跳转语句到达循环内部。goto 和break的跳转范围必须在循环内部,异常处理也必须在循环内部处理,甚至直接reture也不行。在网络查找资料和自己实验,总结如下:
OpenMP是不支持线程中断的,一旦开启,必须执行完毕!
既然不支持,但如果还要实现我的那种要求,该怎么办呢?只有换个思路,更改一下实现方法。
原计划这样实现:
但是迫于无奈,只能这样实现:
从代码中可以看到,先用了临界区,代替线程挂起的操作,而后,用一个外部BOOL变量,用来进行判断,如果下面的条件满足,则改变这个变量的值,其他线程执行时,发现这个变量变化,则不进行任何操作,都continue过去,这样虽然没有直接退出线程,但是起到的效果相当,在使用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时,目前这也是最好的办法。
相关文章推荐
- 如何使用 类进行文件的 I/O 处理
- 使用OpenMP实现多线程,不仅是用在循环处理上
- Windows 窗体控件中的多线程处理之:如何对 Windows 窗体控件进行线程安全调用
- Android使用多个Intent进行Activity跳转,如何直接退出系统
- 如何使用多线程进行计算
- android 使用多个Intent 进行activity跳转 而没有finish的情况,如何直接退出系统
- 用 ConTest 进行多线程单元测试 - 为什么并行测试很困难以及如何使用 ConTest 辅助测试
- 如何使用 类进行文件的 I/O 处理
- Windows 窗体控件中的多线程处理之:如何使用后台线程搜索文件
- Ext Ajax:如何调用Ext.Ajax.request方法和使用Java Servlet进行处理
- 转载:如何使用 类进行文件的 I/O 处理
- 如何使用专用管理连接进行问题诊断和处理 【摘自SQL Server在线帮助】
- 使用JAVA如何对图片进行格式检查以及安全检查处理
- 如何使用 类进行文件的 I/O 处理
- 【转】如何使用 <fstream> 类进行文件的 I/O 处理
- .Ext Ajax:如何调用Ext.Ajax.request方法和使用Java Servlet进行处理
- Ext Ajax:如何调用Ext.Ajax.request方法和使用Java Servlet进行处理
- Android 使用多个Intent 进行activity跳转 而没有finish的情况,如何直接退出系统
- 如何使用Transact-SQL进行事务处理[示例]
- Ext Ajax:如何调用Ext.Ajax.request方法和使用Java Servlet进行处理 .