我正在尝试使用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)
等
由于所有涉及的升级调用,错误消息相当冗长,并且似乎不直接包含我的函数。正如我所说,该程序似乎工作,但将这些错误留在代码中让我感觉不好。有没有什么好方法可以在代码中找到有问题的位置?
感谢您的建议
答案 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)已经通过了很多版本,所以很有可能已经解决了这个问题,或者有其他改变,但是它可以帮助你找到更多关于增强跟踪器的信息吗?