부스트 스레드 라이브러리를 사용하여 스레드의 절반을 작성한 후 충돌이 발생하고 프로그램이 종료되면 부울 스레드 라이브러리를 사용하여 각 스레드에 대한 참조를 전달합니다. 내 가정은 함수가 끝에 도달하면 파일을 닫고 나머지 스레드는 닫힌 파일에 쓰려고한다는 것입니다. 테스트로서 마지막 스레드와 파일에 쓸 수있는 스레드에 대한 조인 문을 추가했습니다. 내 경험 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
방법을 사용하여 해결; 내 직감은 파일 참조를 전달하고 각 스레드가 파일에 추가하게하는 것입니다.
그래, 그게 내가 예상했던 것인데 대부분의 솔루션이 해결했지만 충돌을 피하기 위해 여러 스레드에서 파일에 기록 된 데이터가 정확했다. 어쩌면 ofstream이 내장 된 버퍼 함수로 쓰기를 직렬화 할 것이라고 생각했습니다. –
그럴 수도 있지만 가능하지 않습니다. 어쨌든 그것은 스펙의 일부가 아니며, 나는 그것에 의지하지 않을 것입니다. –