Valgrind:在多线程程序中发现冲突的存储/加载

时间:2014-02-09 23:30:55

标签: c++ multithreading boost boost-asio valgrind

我正在尝试使用boost :: asio和多个线程编写程序。该程序似乎工作正常,但当我使用valgrind线程工具drd运行它时,我收到冲突的存储和加载操作的消息。

== 13740 ==主题2: == 13740 ==线程2在0x06265ff0大小4处冲突存储 == 13740 ==在0x40F2B8:boost :: asio :: detail :: epoll_reactor :: descriptor_state :: set_ready_events(unsigned int)(epoll_reactor.hpp:68) == 13740 == by 0x410097:boost :: asio :: detail :: epoll_reactor :: run(bool,boost :: asio :: detail :: op_queue&)(epoll_reactor.ipp:430)

由于所有涉及的升级调用,错误消息相当冗长,并且似乎不直接包含我的函数。正如我所说,该程序似乎工作,但将这些错误留在代码中让我感觉不好。有没有什么好方法可以在代码中找到有问题的位置?

感谢您的建议

1 个答案:

答案 0 :(得分:0)

相关的错误报告登陆Ubuntu的错误跟踪器(正确的地方IYAM):

  • https://bugs.launchpad.net/ubuntu/+source/boost1.53/+bug/1243570

    详细说明了使用Helgrind(非DRD)检测到的锁定顺序违规。这是更有形的

  • 一些,但也许有趣的讨论在这里:http://lists.boost.org/Archives/boost/2010/06/167818.php

      

    我对此源代码的评论如下:

         
        
    • 类epoll_reactor底部的注释说任何   register_descriptors_的访问应受到保护   registered_descriptors_mutex_。但是,方法shutdown_service()   修改容器registered_descriptors_但不锁定   registered_descriptors_mutex_。

    •   
    • 方法epoll_reactor :: register_descriptor()修改它的第二个   参数(descriptor_data)使其指向新创建的   descriptor_state对象。结构的所有数据成员   descriptor_state是公共的,但所有访问必须由a保护   锁定descriptor_state :: mutex_。所以所有的来电者   必须检查register_descriptor()以验证是否   没有任何线程不安全的访问   descriptor_state :: op_queue_或descriptor_state :: shutdown_。亲身   我从未推荐过这样的课程设计。

    •   
    • 虽然struct descriptor_state成员的所有访问都应该   受锁定descriptor_state :: mutex_保护,没有锁定   最后一个互斥锁由register_descriptor()设置   descriptor_data :: shutdown_或者在它修改时由shutdown_service()   descriptor_state :: op_queue_和descriptor_state :: shutdown_。该   前者易于修复:移动“descriptor_data-> shutdown_ = false”   语句到epoll_ctl()系统调用之前的某个地方。

    •   
         

    上述场景之一是否解释了您观察到的比赛报告?

当然,从那时起(1.43.0-1.55.0)已经通过了很多版本,所以很有可能已经解决了这个问题,或者有其他改变,但是它可以帮助你找到更多关于增强跟踪器的信息吗?