Go中最主要的状态管理机制是依靠通道间的通信来完成的。我们已经在35、工作池 工作的例子中看到过,并且,还有一些其他的方法来管理官田。这里我们来看看如何使用sync/atomic包在多个协程中进行__原子计数__
我们将使用一个无符号整型(永远是正整数)变量来表示这个计数器
WaitGroup帮助我们等待所有协程完成它们的工作。
我们会启动50个协程,并且每个协程会将计数器递增1000次。
使用AddUint64来让计数器自动增加,使用&语法给ops的内存地址。
等待,知道所有协程完成
现在可以安全的访问ops,因为我们知道,此时没有协程写入ops,此外,还可以使用atomic.LoadUint64之类的函数,在院子更新的同时安全地读取他们。
预计会进行50000次操作,如果我们使用非原子的ops++来增加计数器,由于多个协程会互相感染,运行时值会改变,可能会导致我们得到一个不同的数字。此外,运行程序是带上-race标志,我们可以获取数据竞争失败的详情