stdout의 동시 쓰기는 Threadsafe입니까?
이 질문은 표준 출력(stdout) 스트림에 대한 동시 쓰기의 스레드 안전성과 관련이 있습니다. 가다. 특히 다음 코드를 고려하십시오.
<code class="go">package main import ( "fmt" "os" "strings" ) func main() { x := strings.Repeat(" ", 1024) go func() { for { fmt.Fprintf(os.Stdout, x+"aa\n") } }() go func() { for { fmt.Fprintf(os.Stdout, x+"bb\n") } }() go func() { for { fmt.Fprintf(os.Stdout, x+"cc\n") } }() go func() { for { fmt.Fprintf(os.Stdout, x+"dd\n") } }() <-make(chan bool) }</code>
명백한 데이터 경합이 없음에도 불구하고 이 코드의 스레드 안전성에 관해 약간의 논쟁이 있었습니다. 이 문제를 명확히 하기 위해 stdout에 작성하는 메커니즘을 자세히 살펴보고 권장 사항과 참조를 살펴보겠습니다.
FMT 패키지 및 IO.Writer
fmt 패키지 기능은, fmt.Fprintf와 같은 경우 io.Writer 인터페이스를 구현하는 인수를 허용합니다. 내부적으로 이 인터페이스의 Write 메소드를 호출합니다.
OS 및 stdout에 대한 동시 액세스
os.Stdout는 출력을 다음으로 전달하는 io.Writer 인터페이스의 구현입니다. 시스템의 표준 출력. 여러 고루틴이 동시에 os.Stdout에 쓸 때 이 작업의 실제 의미는 기본 운영 체제에 위임됩니다.
POSIX 시스템의 경우 write(2) 시스템 호출이 사용됩니다. POSIX는 동시 write(2) 호출이 일반 파일 및 기호 링크에 대해 원자성임을 지정합니다. 그러나 이 보장은 다른 파일 형식이나 POSIX가 아닌 시스템에는 적용되지 않습니다.
Go 표준 라이브러리 및 래퍼
Go 표준 라이브러리는 쓰기용 래퍼를 제공합니다. 파일 설명자와 소켓. 이러한 래퍼는 io.Writer 인터페이스를 구현하고, os.Stdout의 경우 작업을 관련 시스템 호출로 리디렉션합니다.
Go 런타임은 이러한 래퍼가 동시 액세스를 위해 내부적으로 안전한지 확인합니다. 그러나 단순히 쓰기를 기본 운영 체제에 전달하므로 동시성 의미 체계는 궁극적으로 OS에 의해 결정됩니다.
동시 stdout 쓰기에 대한 영향
권장 사항
참조
위 내용은 Go에서 `stdout`에 쓰는 것이 스레드로부터 안전한가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!