2014-02-09 1 views
0

boost :: asio 및 다중 스레드를 사용하여 프로그램을 작성하려고합니다. 이 프로그램은 잘 작동하는 것 같지만, valgrind 스레드 도구 drd로 실행할 때 충돌하는 저장소 및로드 작업의 메시지가 표시됩니다.Valgrind : 다중 스레드 프로그램에서 상충되는 저장소 /로드를 찾습니다.

== 13,740 == 스레드 2 == 0x06265ff0 크기 4 == 0x40F2B8에서 13,740 ==에서 스레드 2로 가기 상충 13,740 == 부스트 : ASIO :: 상세히 :: epoll_reactor :: descriptor_state을 : : boost :: asio :: detail :: epoll_reactor :: run (bool, boost :: asio :: detail :: op_queue &) : set_ready_events (epoll_reactor.hpp : 68) == 13740 == 0x410097 : (epoll_reactor.ipp : 430)

오류 메시지로 인해 모든 관련 부스트 호출에 다소 긴하고 직접 내 함수를 포함하지 않는 것 같다. 제가 말했듯이, 프로그램은 작동하는 것처럼 보입니다.하지만 코드 안에이 에러들을 남기면 나쁜 느낌을 갖습니다. 코드에서 문제가되는 위치를 찾는 좋은 방법이 있습니까?

답변

0

이와 관련된 버그 보고서는 우분투의 버그 추적기에 도착 조언을

감사 (하지 바로 이곳의 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 클래스의 경우 의 registered_descriptors_ 액세스는 registered_descriptors_mutex_로 보호되어야한다고 말합니다. 그러나 shutdown_service() 메소드 은 컨테이너 registered_descriptors_를 수정하지만 registered_descriptors_mutex_는 잠그지 않습니다.

      • 메소드 epoll_reactor :: register_descriptor는()를 새로 만든 descriptor_state 객체를 가리도록 번째 인수 (descriptor_data)를 수정한다. descriptor_state 구조체의 모든 데이터 멤버는 public이지만 모든 액세스는 descriptor_state :: mutex_에 대한 잠금 에 의해 보호되어야합니다. 따라서 descriptor_state :: op_queue_ 또는 descriptor_state :: shutdown_이라는 스레드에 안전하지 않은 액세스가 있는지 여부를 확인하려면 register_descriptor()의 모든 호출자를 확인해야합니다. 개인적으로 나는 결코 그런 종류 디자인을 추천하지 않았다.구조체 descriptor_state의 모든 구성원 액세스가 descriptor_state :: mutex_ 잠금에 의해 보호되어야하지만 그것이 descriptor_data :: shutdown_도 shutdown_service에 의해를 (설정하면

      • , 어떤 잠금) register_descriptor (가 에이 마지막 뮤텍스를 개최한다)을 수정하는 동안 descriptor_state :: op_queue_ 및 descriptor_state :: shutdown_을 수정합니다. 전자는 수정하기 쉽습니다. "descriptor_data-> shutdown_ = false" 문을 epoll_ctl() 시스템 호출 이전의 어딘가에 옮깁니다.

      위의 시나리오 중 하나에서 관찰 한 경주 보고서에 대해 설명합니까? 물론

    많은 버전은 그 이후로 전달 (1.43.0-1.55.0) 가능성이 주소 또는 기타 변경하지만, 그것은 당신에게 더 많은 정보를 찾을 수있는 단서를 줄 수있다되도록 부스트 트래커?

  • +0

    답변 주셔서 감사합니다. 오류 메시지가 서버 예제에서 인용 된 것과 다르지만 그 원인은 실제로 동일 할 수 있습니다. 유일한 문제는 8 바이트까지 다양한 크기로 쓰기 충돌이 발생하므로 도구를 사용하지 않고 코드를 신중하게 검토해야한다는 것입니다. – Thorsten