Adakah Concurrent Write pada stdout Threadsafe?
Soalan ini berkaitan dengan keselamatan thread bagi penulisan serentak kepada strim output standard (stdout) dalam Pergi. Secara khususnya, pertimbangkan kod berikut:
<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>
Walaupun kekurangan sebarang perlumbaan data yang jelas, terdapat beberapa perdebatan mengenai keselamatan rangkaian kod ini. Untuk menjelaskan isu ini, mari kita mendalami mekanik penulisan untuk mengkaji dan meneliti cadangan dan rujukan.
Pakej FMT dan IO.Writer
Fungsi pakej fmt, seperti fmt.Fprintf, terima hujah yang melaksanakan antara muka io.Writer. Mereka secara dalaman memanggil kaedah Tulis antara muka ini.
OS dan Akses Serentak kepada stdout
os.Stdout ialah pelaksanaan antara muka io.Writer yang mengarahkan output ke keluaran standard sistem. Apabila berbilang goroutin menulis serentak ke os.Stdout, semantik sebenar operasi ini diwakilkan kepada sistem pengendalian asas.
Dalam kes sistem POSIX, panggilan sistem tulis(2) digunakan. POSIX menentukan bahawa panggilan tulis(2) serentak adalah atom untuk fail biasa dan pautan simbolik. Walau bagaimanapun, jaminan ini tidak meliputi jenis fail lain atau sistem bukan POSIX.
Go Standard Library and Wrappers
Pustaka standard Go menyediakan pembungkus untuk menulis kepada deskriptor dan soket fail. Pembalut ini melaksanakan antara muka io.Writer dan, dalam kes os.Stdout, ubah hala operasi ke panggilan sistem yang berkaitan.
Waktu jalan Go memastikan bahawa pembalut ini selamat secara dalaman untuk akses serentak. Walau bagaimanapun, mereka hanya menyampaikan tulisan kepada sistem pengendalian asas, jadi semantik konkurensi akhirnya ditentukan oleh OS.
Implikasi untuk Tulisan stdout Serentak
Pengesyoran
Rujukan
Atas ialah kandungan terperinci Adakah Menulis ke `stdout` dalam Go Truly Thread-Safe?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!