2014-02-09 33 views
0

我想用boost :: asio和多線程編寫程序。該程序似乎工作正常,但是當我使用valgrind線程工具drd運行它時,我收到了衝突存儲和加載操作的消息。Valgrind:在多線程程序中發現衝突的存儲/加載

== 13740 ==線程2: == 13740 ==在0x06265ff0大小4 ==在0x40F2B8 13740 ==通過螺紋2衝突的存儲:升壓:: ASIO ::詳細:: 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

一個相關的bug報告降落在Ubuntu的bug跟蹤系統(正確的地方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類說任何 access_descriptors_的訪問應該由 registered_descriptors_mutex_保護。但是,方法shutdown_service() 會修改容器registered_descriptors_,但不鎖定 registered_descriptors_mutex_。

    • 方法epoll_reactor :: register_descriptor()修改它的第二 參數(descriptor_data),使得其指向新創建 descriptor_state對象。 descriptor_state的struct 的所有數據成員都是公共的,但所有訪問必須由descriptor_state :: mutex_上的 鎖保護。因此,必須檢查所有 register_descriptor()的調用者,以驗證是否存在 descriptor_state :: op_queue_或descriptor_state :: shutdown_,否則不會存在任何線程不安全訪問。親自 我從來不推薦這樣的班級設計。

    • 雖然結構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),所以可能這已得到解決,或以其他方式改變,但它可以給你一個導致更多相關信息助推器?

+0

感謝您的回答,雖然我的錯誤信息與服務器示例中引用的錯誤信息不同,但其原因確實可能相同。唯一讓我擔心的是,由於寫入大小不同的字節會產生衝突,所以我不得不在現在的工具幫助下仔細閱讀我的代碼。 – Thorsten

相關問題