• VS C++ 并发编程


    1.VS2012及以上版本,支持C++11 thread类的并发编程。

    相关材料可以参考博客:http://www.cnblogs.com/rangozhang/p/4468754.html

    2.但对其之前的版本,可采用以下方式,实现类成员函数创建子线程实现并发。

      首先需实现线程类的run函数,故定义了线程类的头文件和其对应的函数实现,具体如图1,2所示:

    图1 线程类的头文件

    图2 线程类的实现文件

      注意到继承的DerivedThread类,只需将并发执行的函数写在其对应的run()函数内即可。

      其中需要注意的是:子线程运行结束的条件。下面以一个项目为例,进一步说明其重要性。

      上述截图中,类成员TempGrayImg是已知的输入图像,TempOptMMStir是未知的目标掩码图像,之前错误的做法是:以目标掩码图像TempOptMMStir非零像素点的个数是否为零作为当前子线程是否结束的标志,但这其中的问题是,若当前线程执行了一部分,TempOptMMStir掩码图像出现部分目标时,其非零像素个数已经大于零,但实际上还未得到最终的目标掩码图像,这就可能导致子线程还未执行完,主线程便提前结束休眠,开始执行,从而导致一系列的错误,最明显的错误是相关内存资源的提前释放,导致还未执行完成的子线程访问了已经释放资源的相关变量,进而出现错误,即出现野指针(对于图像的表征是:图像指针不为NULL,但其长度和宽度为零或无效数值)。

    图3

      图3从上至下的第三个红色矩形中,即是线程结束的判断方式。上面两个红色矩形是还未实现成功的C++ Thread类进行并发运行的方法,后面需进一步研究改进。

  • 相关阅读:
    Mybatis中的设计模式
    Mybatis的#{}和${}的区别是什么?
    ES的写入速度优化
    康师傅JVM:垃圾回收相关概念(十六)
    i++为什么不是原子操作?
    Zookeeper的watch机制
    LeetCode 1.两数之和
    ESP 8266 引脚图
    Arduino 将 String 转化为 int
    微擎修改 icon.jpg 后项目主页未变
  • 原文地址:https://www.cnblogs.com/hust-yingjie/p/7050996.html
Copyright © 2020-2023  润新知