WinAPI多线程和OpenMP多线程

来源:互联网 发布:网络舆情监测的过程 编辑:程序博客网 时间:2024/05/16 17:14

 

WIN32线程控制主要实现线程的创建、终止、挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数。在启动一个线程之前,必须为线程编写一个全局的线程函数,一般来说,C++的类成员函数不能作为线程函数。这是因为在类中定义的成员函数,编译器会给其加上this指针。如果一定要以类成员函数作为线程函数,通常有如下解决方案:

(1)将该成员函数声明为static类型,去掉this指针;将成员函数声明为静态虽然可以解决作为线程函数的问题,但是它带来了新的问题,那就是static成员函数只能访问static成员。解决此问题的一种途径是可以在调用类静态成员函数(线程函数)时将this指针作为参数传入,并在改线程函数中用强制类型转换将this转换成指向该类的指针,通过该指针访问非静态成员。

(2)不定义类成员函数为线程函数,而将线程函数定义为类的友元函数。这样,线程函数也可以有类成员函数同等的权限;

(3)可以对非静态成员函数实现回调,并访问非静态成员。 线程之间通信的两个基本问题是互斥和同步。线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。线程互斥是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows的.res文件,譬如全局变量就是一种共享资源),在各线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。 虽然WIN32提供的一组API函数在大多时候是可以解决多线程问题,但是由于工作程序中涉及的变量太多,函数之间的调用关系比较复杂,发现用WIN32提供的一组API函数实现起来难度很大,后来就改用OpenMP。   

      OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。OpenMP应用编程接口API是在共享存储体系结构上的一个编程模型,包含编译制导(Compiler Directive)、运行库例程(Runtime Library)和环境变量(Environment Variables),支持增量并行化(Incremental Parallelization)。是C/C++ 和Fortan等的应用编程接口。   

     要使用OpenMP,首先开发环境必须支持OpenMP,在这个过程,遇到了很多的问题,在此我把它整理出来与大家共享,希望对初学OpenMP的人有些帮助。 VC2005 在VC版本中,只有Visual C++ 2005提供了一个新的/openmp开关来使能编译器支持OpenMP指令。(你也可以通过项目属性页来使能OpenMP指令。点击配置属性页,然后[C/C++],然后[语言],选中OpenMP支持。)当/openmp参数被设定,编译器将定义一个标识符_OPENMP,使得可以用#ifndef _OPENMP来检测OpenMP是否可用.(配置图见相册 VC上使用OpenMP并行程序设计:VC2005设置)

      1. 虽然 VisualStudio 2005 Express 也有 OpenMP 的选项,但是实际上并没有附上 OpenMP 的函数库,所以理论上是不能用的;不过如果能找到 Standard 或 Professional 版的版本放进去,也是可以运作的! 2. 神奇的是…原则上如果?有用到 OpenMP 的 Function,而只是用 directive 和 clause 的话,应该是可以不用 #include 才对;但是在 Express 中,不加入 #include 可以正确的编译、执行,而 Professional 版却只能正确的编译,而无法正确的执行(dll 起始错误)。 由于VC6.0和VC2003没有/openmp开关来使能编译器支持OpenMP指令,但是我们可以通过改用Intel编译器的方法,来使它支持OpenMP指令。我们必须保证先安装VC6.0和VC2003,在安装Intel编译器,Intel编译器在其官方网站上下载。 VC6+Intel Compiler 9.1 1.安装完Intel编译器后,在VC6.0的Tools下面会新增一个关于Intel编译器,进入勾选安装的Intel编译器版本(推荐使用Intel Compiler 9.1版本)。

      2.在project中打开project settings,在C/C++ ->reprocessor definitions里加入_USE_INTEL_COMPILER 即可以使用Intel Compiler 进行编译。编译窗口应该显示使用icl进行编译,OpenMP支持可以在C/C++ -> Project Options 里添加 /Qopenmp。

      建议仔细阅读Intel Compiler的帮助,里面有详细的如何在VC6上使用Intel Compiler进行编译的说明,我想应该不难解决编译问题。 VC2003+Intel Compiler 9.1 1.

      1.装换使用Intel编译器,点击Convert to use Intel(R) C++ Project System. 

      2.打开项目->属性页,选择支持OpenMP. (配置图见相册VC上使用OpenMP并行程序设计中:VC2005设置)   

      我相信只要按照上面的步骤执行,应该是可以在VC环境下支持使用OpenMP的。另外还要注意的一点就是,由于Intel 编译器比VC++自带的编译器要严格,所以在改用Intel编译器后,可能会出现一些移植错误.