문제

fprintf 스레드-안전입니까? glibc 매뉴얼 fprintf ()에 대한 단일 호출을 사용하여 파일에 쓰는 내 응용 프로그램은 다른 프로세스에서 부분 쓰기를 섞는 것 같습니다.

편집 : 명확히하기 위해, 문제의 프로그램은 lighttpd 플러그인 및 서버는 여러 작업자 스레드로 실행 중입니다.

파일을 보면 일부 쓰기는 섞여 있습니다.

편집 2 : 내가보고있는 문제는 LightTPD의 "작업자 스레드"때문일 수있는 것 같습니다. 실제로 별도의 프로세스입니다. http://redmine.lighttpd.net/wiki/lighttpd/docs:multiprocessor

문제

동일한 소켓에서 2 개 이상의 프로세스를 실행하면 동시성이 더 좋을 것이지만 다음과 같이 알아야 할 몇 가지 단점이 있습니다.

  • mod_accesslog는 동일한 파일이 두 번 열리고 동기화되지 않으므로 깨진 액세스 로그를 생성 할 수 있습니다.
  • mod_status가 가질 것입니다 N 별도의 카운터, 각 프로세스에 대해 하나의 세트.
  • mod_rrdtool은 동일한 타임 스탬프를 두 번 받으면 실패합니다.
  • mod_uploadprogress에는 올바른 상태가 표시되지 않습니다.
도움이 되었습니까?

해결책

여러 스레드에서 쓰고 여러 프로세스에서 쓰는 두 가지 개념을 혼동하고 있습니다.

프로세스 내에서 다음은 출력 버퍼에 액세스하기 전에 FPRIRTF의 하나의 호출이 완료되도록 할 수 있지만, 일단 앱이 파일로 출력되면 OS의 자비에 있습니다. 어떤 종류의 OS 기반 잠금 장치가 없으면 완전히 다른 응용 프로그램이 로그 파일에 쓰지 않도록 할 수 없습니다.

다른 팁

당신이 읽어야하는 것처럼 들립니다 파일 잠금. 당신이 가진 문제는 여러 프로세스 (예 : 스레드가 아닌)가 동시에 동시에 쓰고 있으며, 쓰기가 원자력이 될 수있는 신뢰할 수있는 방법이 없다는 것입니다. 이로 인해 파일이 서로의 쓰기, 혼합 출력 및 전적으로 비 결정적 행동을 덮어 쓸 수 있습니다.

이것은 단일 프로세스 멀티 스레딩 프로그램에서만 관련이 있기 때문에 스레드 안전과 관련이 없습니다.

현재 C ++ 표준은 동시성에 대해 유용한 것은 없으며 1990 C 표준도 말하지 않습니다. (1999 C 표준을 읽지 않았으므로 언급 할 수 없습니다. 다가오는 C ++ 0X 표준은 말을하지만 정확히 무엇을 오프한지 모르겠습니다.)

이는 fprintf () 자체가 스레드 안전하거나 다른 방법이 아니며 구현에 의존 할 가능성이 있음을 의미합니다. 나는 GLIBC 문서가 그것에 대해 말한 내용을 정확하게 읽고, 당신이하고있는 일과 정확히 비교할 것입니다.

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