锁有两个功能,一是用作内存屏障(memeory barrier),二是逻辑同步原语。单线程多协程可以免去内存屏障,但是同步原语是省不掉的。
比如几个协程共用一个 socket 写数据。。这是很有可能的,现在的 HTTP2/HTTP3 都是多流,一条 tcp 流里面好几个 HTTP 请求。
因为协程网络库都会在网络阻塞的时候切换到其它协程,如果刚好两个协程要向服务端发送了 HTTP 请求,这个 tcp 流就乱了,一会儿这个协程写,一会儿另外一个协程写。这肯定不行的对吧。解决方案就是锁,或者队列——但队列背后也是一个锁。
【 在 txgx (纸上谈医) 的大作中提到: 】
: In contrast to threads, which are pre-emptive, coroutine switches are cooperative (programmer controls when a switch will happen). The kernel is not involved in the coroutine switches.
: 所以我觉得不用锁。
: 发自「今日水木 on HUAWEI G750-T01」
: ...................
--
修改:hgoldfish FROM 124.72.118.*
FROM 124.72.118.*