2013-03-08 5 views
0

부스트 스레드 라이브러리를 사용하여 스레드의 절반을 작성한 후 충돌이 발생하고 프로그램이 종료되면 부울 스레드 라이브러리를 사용하여 각 스레드에 대한 참조를 전달합니다. 내 가정은 함수가 끝에 도달하면 파일을 닫고 나머지 스레드는 닫힌 파일에 쓰려고한다는 것입니다. 테스트로서 마지막 스레드와 파일에 쓸 수있는 스레드에 대한 조인 문을 추가했습니다. 내 경험 mutithreading 2 일입니다 - 어제 나는 부스트 라이브러리를 구축하고 C + + 또는 다른 언어로 훨씬 더 많은 경험을하지 않습니다.ofstream 여러 개의 부스트 스레드에서 쓰기 - g ++ 및 vs2008

"이미 답변 일 수도있는 질문"을 읽었지만이 질문에 대한 답변은 없습니다. 이 문제의 버전과 해결책에 대한 많은 접근법을 다루는 게시물이 너무 많습니다. 과도하게 생각하는 것 같고 파일이 닫히기 전에 모든 스레드가 완료되었는지 그리고 각 스레드에서 쓰기가 완료되었는지를 확인하는 명확한 방법이 있습니다. 쓰기 충돌을 방지하기 위해 대기열에 버퍼링됩니다.

몇 가지 가능한 솔루션 :

, 열린 파일을 전달하는 파일 참조를 전달하고 각 스레드가 파일을 열 수 있도록, 추가 및 가까운 ofstream myfile("database", ios::out | ios::app);보다는
  • -이 게시 솔루션 "How do I add..."에서; 이, 그것은 asnwer처럼 "error C2039: 'join_all' : is not a member of 'boost::thread'"

  • Use boost mutex or locks이 설명이 보인다

  • 가하는 join_all() 기능이있는 boost thread documentation을 통해 읽기하지만 부스트 1.53.0 버전에서 VS2008에서 컴파일 작동하지 않았다 하지만 먼저 충돌이 복수로 인해 발생했는지 알고 싶습니다. 쓰레드가 충돌하기 전에 쓰거나 쓰레드가 닫히기 전에 쓰는 것이 좋습니다. 보장이 코멘트 이

  • 을 무엇을 의미하는지

  • This one states에 대해 뭔가 boost::thread and boost::function 다른 사람 같이 일하지만, boost::function 문헌을 검토하는 것은 설명 할 도움이되지 않았다가 없음을

  • c++ ostream::write page 참조 멀티 스레딩, 그러나 다만 상태

  • 위로 가기 모든 스레드가 완료 될 때까지 기다리는 데 문제가 있고 쓰기 충돌이 아닌 this discussion provides a solution 인 경우로 돌아 가기 이 게시물의 마지막 솔루션은 대답처럼 들리지만이 더 투표가 없습니다 그것은 윈도우 인 경우 내가 말할 수 없습니다 -모든 스레드를 저장하고,이 특정 창입니다 특정 WaitForMultipleObjects하지만 을 join()

  • This discusses the 창을 호출해야합니다 특정 또는 아닙니다.

  • Buffer everything to memory 별도의 기능으로 쓰기 -이 솔루션은 C#이지만 접근 방법은 그럴듯합니다. 그들의 토론 내용은 나에게 이해가 가지 않는다.

  • create threads in a loop - 가장 선명한 리뷰가있는 것 같습니다. 이 더 포럼 토론하지만 그들은 내가 윈도우와 리눅스 모두에서 작동하는 솔루션을하고 싶습니다

이전 예제의 더 많은 버전 같은 소리

  • 이 스레드에 주어진 boost::thread_group 방법을 사용하여 해결; 내 직감은 파일 참조를 전달하고 각 스레드가 파일에 추가하게하는 것입니다.

  • 답변

    1

    여러 스레드에서 동일한 스트림으로 조정되지 않은 쓰기 후에 어떤 결과가 나타 납니까? 어쨌든 스트림이이 고문에서 살아남 았다고 할지라도 쓰레기가 될 것입니다 ... 글쓰기 사이에 일종의 조화를 구현해야합니다.

    +0

    그래, 그게 내가 예상했던 것인데 대부분의 솔루션이 해결했지만 충돌을 피하기 위해 여러 스레드에서 파일에 기록 된 데이터가 정확했다. 어쩌면 ofstream이 내장 된 버퍼 함수로 쓰기를 직렬화 할 것이라고 생각했습니다. –

    +0

    그럴 수도 있지만 가능하지 않습니다. 어쨌든 그것은 스펙의 일부가 아니며, 나는 그것에 의지하지 않을 것입니다. –