作者回复: 对,不会,这是defer的机制保证的。
作者回复: √
作者回复: 传统的协程只是线程内的流程控制工具。它没法做到一个线程内有两个及以上控制流同时进行,只能是这一个挂起那一个运行然后那一个挂起这一个再运行。同时它也不属于多线程编程,没法统一调度多个线程内的控制流。
goroutine 我就不用多说了,它属于用户级线程,与系统级线程搭配使用,很强大也很灵活。深入的东西可以看我的那本《Go 并发编程实战》。
作者回复: 简单一句话:读写锁中的读锁锁定操作之间是不互斥的。另外,对于读写锁,读锁锁定操作会与写锁锁定操作互斥,写锁锁定操作之间也会互斥。
作者回复: 那要看谁先等待了,这里的等待队列是先进先出的。
作者回复: 对于非缓冲通道,写的 goroutine 必然会先完成操作。锁本身只保证互斥。被阻塞的 goroutine 也会有先有后,但会根据被阻塞那一刻的先后,而不是什么读写的先后。
另外互斥锁跟原子操作有本质上的区别,不要搞混。
再另外,goroutine 与协程也有本质上的区别,不要搞混。
作者回复: 看这里吧:https://github.com/hyper0x/Golang_Puzzlers/tree/master/src/puzzlers/article22
你可以把这里的 article 理解成 topic。一些比较长的 topic 可能会被编辑拆分为多篇文章,所以就出现了这种情况。太长的文章对读者们不太友好,不容易集中精力读下去。
你可以对照着专栏的目录,按照主题,找一下对应的 articleXX 目录。
Update:
我刚刚添加了一个序号映射表:https://github.com/hyper0x/Golang_Puzzlers/blob/master/mapping_table.md 。你用这个就可以方便地对照了。
作者回复: 你可以理解为同一把锁保护的多个代码段。
作者回复: 这里说的就是可重入锁啊。