--
--
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina
As a general guide, though:
| Channel | Mutex |
| passing ownership of data, distributing units of work, communicating async results | caches, state |
--
On 2013年1月18日Friday at 上午10:41, Risingv wrote:message passing 更多的是一种 programming paradigm。
> Mutex和Message Passing(即channel)解决的都是race condition的问题
mutex 才是专门用来解决 race condition 的一种方式。
比如科学计算里的 MPI 跟 mutex 一点关系都没有。
那个方便还是看具体场景吧。Rob Pike 的 reference counter 的例子里用 mutex 就比用 channel 更方便。
> 只是解决的思路不一样,而后者的实现成本一般都比较高,golang便是这样的
> mutex或者semaphore更高效, 但channel让并发编程更容易
> 两者之间的取舍就是(效率+低可维护性)和(相对低效率+高可维护性)之间的取舍
至于 mutex 是否一定让程序更高效还要看程序组织。
goroutine & channel 提供了一种新的程序组织方式,更容易从设计上避免共享,在多核上更容易得到伸缩性 。
另外觉得 channel 是否一定比 mutex 低效还要看具体实现吧,minux 应该可以提供更多解释。
On 2013年1月18日Friday at 上午11:49, Risingv wrote:
>
> 在 2013年1月18日上午10:56,Chen Yufei <cyfd...@gmail.com (mailto:cyfd...@gmail.com)>写道:
> > On 2013年1月18日Friday at 上午10:41, Risingv wrote:message passing 是提供了一种通信机制,不过它在概念上跟 lock 没什么本质联系。
> > > Mutex和Message Passing(即channel)解决的都是race condition的问题
> >
> >
> > message passing 更多的是一种 programming paradigm。
> > mutex 才是专门用来解决 race condition 的一种方式。
> >
> > 比如科学计算里的 MPI 跟 mutex 一点关系都没有。
>
> message passing更多是解决ipc问题,但我认为其本质就是一个lock-based FIFO Queue
多核 CPU 的 cache coherence protocol 其实就是 message passing 的方式实现的,也就是说虽然我们是用 coherent shared memory 来实现 lock,但在底层是用 message passing 实现的。
如果 CPU 暴露 message passing 的功能给程序员,那 message passing 在某些场合下效率就会比 lock based programming 更高。
> 它天然地保证了上锁和解锁的顺序,所以使用起来很方便,也使它天然地易于解决race condition
即使用 lock 来实现 message passing,拿锁解锁顺序也没保证。多个 goroutine 同时向一个 channel 发数据,在接收端先收到哪个是不能保证的。
没有任何的共享就不会有 race condition。但实际程序中总是会有一些东西需要共享,所以需要某种同步机制控制对共享资源的访问。
mutex 是同步机制的一种(互斥访问),channel 提供了另一种同步机制,保证通信和同步同时发生(buffer size 为 0)。但是注意 message passing 本身并没有提供同步。
基于 lock 的同步机制难以使用,channel 好用并只是因为 message passing。
>
> >
> > > 只是解决的思路不一样,而后者的实现成本一般都比较高,golang便是这样的
> > > mutex或者semaphore更高效, 但channel让并发编程更容易
> >
> > > 两者之间的取舍就是(效率+低可维护性)和(相对低效率+高可维护性)之间的取舍
> >
> >
> > 那个方便还是看具体场景吧。Rob Pike 的 reference counter 的例子里用 mutex 就比用 channel 更方便。
> >
> > 至于 mutex 是否一定让程序更高效还要看程序组织。
> > goroutine & channel 提供了一种新的程序组织方式,更容易从设计上避免共享,在多核上更容易得到伸缩性 。
> >
> >
> > 另外觉得 channel 是否一定比 mutex 低效还要看具体实现吧,minux 应该可以提供更多解释。
>
> 从程序角度考虑,这个问题自然是没有固定结论的。
> 我的意思是在一个很小的上下文中,chanel & goroutine的开销往往比Mutex要大,
> chanel要和goroutine一起使用才有威力,而一个goroutine至少需要4k+的内存,而mutex的开销要小得多
>
> 当并行的逻辑和上下文变得复杂,那么这种开销就变得值得了,没必要去节省那一点点的内存的cpu时间
> 我想Rob Pike想传达的是这个意思吧
>
+1
channel是更高层次上的抽象概念,内部估计也是借用mutex之类同步手段。
在 2013-1-18 上午11:49,"Risingv" <franc...@gmail.com>写道:
>
>
>
>
> 在 2013年1月18日上午10:56,Chen Yufei <cyfd...@gmail.com>写道:
>
>> On 2013年1月18日Friday at 上午10:41, Risingv wrote:
>> > Mutex和Message Passing(即channel)解决的都是race condition的问题
>>
>> message passing 更多的是一种 programming paradigm。
>> mutex 才是专门用来解决 race condition 的一种方式。
>>
>> 比如科学计算里的 MPI 跟 mutex 一点关系都没有。
>
>
> message passing更多是解决ipc问题,但我认为其本质就是一个lock-based FIFO Queue
> 它天然地保证了上锁和解锁的顺序,所以使用起来很方便,也使它天然地易于解决race condition
>
+1 这channel的本质就是一个基于全局锁的先进先出的缓存队列。