zoukankan      html  css  js  c++  java
  • C++多线程下出现内存越界问题总结

    工作中遇到这样一个问题,某个多级流水多线程的程序,在压力测试下会偶现segmentation fault11错误,错误出现在运行类函数的地方,而后排查后发现是由于多线程争抢导致类被析构后才走入判断,导致出现内存越界。

    class A
    {
      bool error_;
      int Reply();
    }
    Task1.cpp
    if
    (a->process1() != 0) a->error_ = true; if (!a->error_) { do { if (a->process2() != 0) { a->error_ = true; break; }
    put_next(a); }
    while(0); } if (a->error_) { a->Reply(); }

    代码流程如上:

    1、多级流水:Task1->Task2->Task3,且每个Task内有多个线程

    2、Task1处理完毕后将a放入Task2的消息队列,此时由于CPU争抢导致Task1被卡住,未能继续执行

    3、Task2、Task3依次处理完成后,a消息返回给上级模块,delete a

    4、此时Task1获取到CPU资源,继续执行

    5、而a已被析构,Task1内的a仍旧保存原有指针地址

    6、由于a已被析构,a->error_不可预知,进入判断,走到a->Reply(),然而a已析构,所以崩溃。

    总结:多线程程序中线程内和线程间的执行顺序不可预知,要确保每个线程内只能有一个终点,尽量避免GOTO或多次判断导致出现逻辑分支的情况。

  • 相关阅读:
    Nginx
    Nginx & AWStats 安装、配置、使用
    Nginx
    linux
    工作中的 Vim 和 git
    后端
    django
    django
    awk流程控制
    linux系统内置函数
  • 原文地址:https://www.cnblogs.com/zl1991/p/11132297.html
Copyright © 2011-2022 走看看