問題は Go コンパイラーによる最適化ではなく、同期の欠如です。 i への代入の後には同期イベントが続かないため、他のゴルーチンによって監視されることは保証されません。実際、積極的なコンパイラは i ステートメント全体を削除する可能性があります。
Go メモリ モデル
Go メモリ モデルは、変数を 1 つのステートメントで読み取る条件を指定します。 goroutine は、別の goroutine の同じ変数への書き込みによって生成された値を監視することを保証できます。
アクセスをシリアル化するには、チャネル操作などでデータを保護します。
プログラムの動作を理解するためにこのドキュメントの残りの部分を読まなければならないとしたら、あなたは賢すぎます。
Synchronization
次の例では、 a への代入の後に同期イベントが続かないため、監視されるかどうかは保証されません。他のゴルーチンによって。実際、積極的なコンパイラは go ステートメント全体を削除する可能性があります。
var a string
func hello() {
go func() { a = "hello" }()
print(a)
}
次の例は、sync.Mutex.
package main
import (
"sync"
"time"
)
func main() {
mx := new(sync.Mutex)
i := 1
go func() {
for {
mx.Lock()
i
mx.Unlock()
}
}()
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3