문제

응용 프로그램에서 boost.spirit and boost.thread 라이브러리를 사용하는 동안 충돌이 발생하고 있습니다. 이것은 메인 스레드에서 과정의 수명 동안 Spirit Parser를 사용한 경우에만 발생합니다.

충돌은 출구에서 발생하며 Spirit Parser가 할당 한 스레드 특이 적 스토리지의 정리와 관련이있는 것으로 보입니다. 스레드 특정 메모리가 이미 언로드 된 DLL 내부에 할당되므로 DLL이 언로드 된 시퀀스로 인해 충돌이 발생할 수 있습니다. 그러나 응용 프로그램 자체가 종료 될 때까지 Boost.thread DLL은 언로드되지 않습니다.

프로세스 데트 알림을받을 때 DLL-Main의 스레드 별 스토리지를 청소하도록 강요 할 수있는 방법이 있습니까?

모든 솔루션/힌트에 감사드립니다.

추신! 내 플랫폼 및 설정 :

  • Visual Studio 2005
  • boost_all_dyn_link
  • boost_spirit_threadsafe
도움이 되었습니까?

해결책

글쎄, 나는 해결 방법을 찾았다.

Boost :: spirit :: 구문 분석 호출을 사용하는 모든 곳에서는 기본적으로 Workerthread를 스폰하여 실행하는 동안, 호출 스레드는 Workerthread와의 조인 호출에서 차단됩니다. 이상적이지는 않지만 지금까지 어떤 부작용없이 작동하는 것처럼 보입니다.

내 직감은 별도의 실이 실제로 필요하지 않아야한다는 것입니다.

다른 팁

boost.spirit은 헤더 전용이며, 즉 자체 DLL에 존재하지 않으므로 DLL의 언로드 순서가 아니라 다른 문제 일 수도 있습니다.

Spirit Parser가 포함 된 인스턴스가 삭제되고 매달려있는 포인터를 남기지 않도록하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top