小编典典

如果我正确使用通道,是否需要使用互斥锁?

go

如果我正确使用通道,是否需要使用互斥锁来防止并发访问?


阅读 403

收藏
2020-07-02

共1个答案

小编典典

如果正确使用通道,则不需要互斥。在某些情况下,使用互斥锁的解决方案可能会更简单。

只需确保包含通道值的变量已正确初始化,然后使用多个goroutine尝试访问通道变量即可。一旦完成,按设计访问通道(例如,向它们发送值或从中接收值)是安全的。

带有参考文献的证明文件(重点由我添加):

规格:渠道类型:

单个信道 ,可以使用
发送的语句接收操作,并调用内置的功能cap
通过任何数量的够程无需进一步同步
。通道充当先进先出队列。例如,如果一个goroutine在通道上发送值,而第二个goroutine接收到它们,则按发送顺序接收值。len


有效执行:并发:通过交流共享

实现对共享变量的正确访问所需的微妙之处使得在许多环境中进行并行编程变得很困难。Go鼓励采用一种不同的方法,在这种方法中,共享值在通道中传递,实际上,决不由单独的执行线程主动共享。
在任何给定时间,只有一个goroutine可以访问该值。 根据设计,不会发生数据争用。为了鼓励这种思维方式,我们将其简化为一个口号:

不要通过共享内存进行通信; 而是通过通信共享内存。

这种方法可能太过分了。例如,最好通过将互斥锁放在整数变量周围来完成引用计数。但是,作为一种高级方法,使用通道来控制访问权限使编写清晰,正确的程序变得更加容易。

本文也非常有帮助:Go Memory Model

还引用了的打包文档sync

包同步提供基本的同步原语,例如互斥锁。除一次和等待组类型外, 大多数都供低级库例程使用。 更高级别的同步最好通过渠道和通信来完成。

2020-07-02