我想问下协程的问题,如果一个线程编码然后发送到队列里 然后用协程发送数据,那么这个队列的锁是怎么实现的,能保证协程和线程之间同步。
协程有好几种的,有 GO 的协程,有 C++20 的协程,有 StateThread 的协程。你用的是什么协程
StateThread 里怎么处理这种情况的? 这个能在线程和协程间同步的锁 实现原理是啥样的啊
我以前写的一篇旧文章里面讲解了 互斥锁的 实现原理 《ST源码分析-协程通信》
上面这篇文章是比较久写的,我的新书《SRS原理》里面还有更多协程原理的内容。欢迎购买 https://srs.xianwaizhiyin.net/
《ST源码分析-协程通信》这篇文章里面讲的 应该只是 单线程内协程同步 的
小助手 是的,这是 单线程内协程同步的
那SRS里没有上面我说的情况?
如果一个线程编码然后发送到队列里 然后用协程发送数据,那么这个队列的锁是怎么实现的,能保证协程和线程之间同步
因为编码是计算密集型任务,所以肯定是在单独线程
没有,他们不这么用。
SRS 的 StateThread 是已经搞成多线程的了。 但是我看他们设计,各个线程间是独立的,主要是通过通知的方式通信好像。
例如 A 线程里面有 110 个协程,B 线程 有 1120 个协程。
第 1 个协程 绝对不会操作 第 11 个协程的资源。他们应该是想这样用的
loken 罗老师,我还是不太明白,“通知的方式”是什么意思,编码后的数据怎么通过协程发送呢?
你提的这个问题很复杂,我还要仔细想想。
这个好像挺简单,在 StateThread 的场景下,直接用全局队列 queue ,然后操作的时候用线程锁 pthread_mutex_lock 加锁,然后写入全局队列 queue, 因为线程锁会阻塞所有的 协程,例如 线程 A pthread_mutex_lock 卡住了,在等待锁,那第1 ~ 10个协程都会卡住。
然后线程B 也是调 pthread_mutex_lock 加锁,然后读取全局队列 queue 就行了。 线程 B 也有 11 ~ 20 个协程
loken 问题是 线程A 中的 其他协程 被阻塞了 >!!<
小助手 嗯嗯,是啊,那怎么让它不阻塞呢?
可以看看 GO 协程的实现,看看他是怎么解决这个问题的。
我想到了,好像可以用 pipe 管道来做这个事情。
你用 Linux 的 pipe 创建出一个 read fd,一个 write fd。
write fd 放在 线程 A 里面, read fd 放在线程 B 里面。
只要是 fd io,StateThread 就能协程化,不会阻塞其他协程。
可以参考这篇文章《HTTP服务器server程序信号处理》