1// run 2 3//go:build !js && !wasip1 4 5// Copyright 2017 The Go Authors. All rights reserved. 6// Use of this source code is governed by a BSD-style 7// license that can be found in the LICENSE file. 8 9package main 10 11import ( 12 "fmt" 13 "runtime" 14 "sync/atomic" 15 "time" 16) 17 18var a uint64 = 0 19 20func main() { 21 runtime.GOMAXPROCS(2) // With just 1, infinite loop never yields 22 23 go func() { 24 for { 25 atomic.AddUint64(&a, uint64(1)) 26 } 27 }() 28 29 time.Sleep(10 * time.Millisecond) // Short sleep is enough in passing case 30 i, val := 0, atomic.LoadUint64(&a) 31 for ; val == 0 && i < 100; val, i = atomic.LoadUint64(&a), i+1 { 32 time.Sleep(100 * time.Millisecond) 33 } 34 if val == 0 { 35 fmt.Printf("Failed to observe atomic increment after %d tries\n", i) 36 } 37 38} 39