2013-11-26 1 views
3

나는 이진 파일을 읽는 데 복수 std::ifstream을 사용하는 프로그램을 만들고 있는데, 하나는 각 스레드에 대해 std::ifstream이다. 이제는 std::ofstream이 Windows에서는 스레드로부터 안전하고 같은 파일에 쓰려면 Linux인지 확인해야합니다. std::ofstream 하나만 사용하고 여러 스레드에 사용하고 있습니다.
각 스레드를 사용하여 출력 블록에 seekp()write()을 사용하여 다른 블록을 읽습니다. 현재 그것은 나를 위해 일하고 있지만 큰 파일에 문제가 있는지 여부는 다릅니다.ofstream 스레드는 안전합니까?

std::ofstream은 안전합니까?

+1

는이 이 http://stackoverflow.com/questions/2754303/is-stdifstream-thread-safe-lock-free – VDN

+0

* iostream * 클래스를 통해 이동하시기 바랍니다 도움이 될 것입니다 다음은 예외입니다 참조하십시오. 여러 스레드에서 객체에 쓰는 것이 안전합니다. "두 스레드의 출력이 섞일 수 있습니다." – SChepurin

+0

[쉽게 std :: cout thread-safe하는 방법?] (http://stackoverflow.com/q/14718124/1468366) – MvG

답변

6

C++ standards (입력/출력 라이브러리 스레드로부터의 안전성)에서 :

27.1.3 스레드 안전 [iostreams.thread 안전] 스트림 오브젝트 [string.streams, 파일

동시 액세스 할 수 있습니다. 스트림] 버퍼 스트림 객체 [stream.buffers] 또는 C 라이브러리 스트림 [c.files]이 다중 스레드에 의해 지정되면 [iostream.objects]가 지정되지 않은 한 데이터 race [intro.multithread]가 발생할 수 있습니다. [참고 : 데이터 경주 은 정의되지 않은 동작을 발생시킵니다 [intro.multithread].

+0

달리 명시하지 않는 한이 부분을 어떻게 번역합니까 [iostream.objects] ...? – SChepurin

+0

즉, IO 라이브러리가 스레드로부터 안전하다는 것을 "당연히"추측 할 수 없다는 것을 의미합니다 (구현에 따라 다를 수 있음). – Claudix

7

만약 내가 당신을 오해하지 않았다면 - 아니요, 표준 라이브러리의 어떤 것도 스레드 안전하지 않습니다 (물론 std::thread 특정 사항은 제외하고 (C++ 11 이상부터)). 추가 동기화가 필요합니다.

더 많은 프로세스가 있고 이러한 파일에서 읽고 쓰는 경우 액세스를 동기화하려면 파일을 잠 가야합니다.

+2

@downvoter - 설명 할 수 있습니까? –

+8

사일런트 downvoters 빨아 – Claudix

+0

내가 액세스 (읽기/쓰기) * differen * 동시에 파일을 이해한다면, 나는 어떤 문제를 기대해야합니까? – ransh

2

예. 그것은.

Windows의 경우 Windows의 여러 스레드에서 fstream에 쓰기가 안전합니다. msdn 문서를 참조하십시오. Thread Safety in the C++ Standard Library

Linux의 경우 : 즉, 그렇습니다. document of libstdc++ : "플랫폼의 C 라이브러리가 threadsafe 인 경우 fstream I/O 작업은 최저 수준에서 스레드 안전성이 보장됩니다." 플랫폼의 C 라이브러리가 스레드 안전합니까? 예. POSIX 표준은 C stdio FILE * 연산 (fread/fwrite와 같은)은 원자 적이며 glibc는 그렇게했다.

관련 문제