message_queue
学习过程中,我发现了一扇新的世界,The c standard manual
这里记录文件
skynet_mq.h
andskynet_mq.c
的阅读结果.
消息队列
1. 为什么用队列?
因为消息需要先入先出(FIFO).
剩下几个问题:
- 如何自己在代码中也使用自旋锁,请写一个示例代码。
- 次级消息队列(message queue)中的字段
in_global
尚且晦涩不明,感觉不到它的用处。- 从全局消息队列中将次级消息队列取出来的时候,in_global 是否需要设置为 0 ? 因为此时已经不在全局队列中了(但是根据注释是不需要的,因为 1 用来同时表达
在全局队列中
和the message is dispatching.
) - 如果消息队列的消息为空的时候,设置了 in_global 为 0. 没有问题,因为拿次级消息的时候,从全局中弹出来了,此时次级消息队列不在全局队列中.
- 压入消息的时候,如果 in_global 为 0. 则设置为 1, 并且压入全局队列。
- 结合以前的认知,等于 0, 一定就是在外面,没有浪费cpu; 等于 1 ,可能在外面,属于 message is dispatching. (随后,在
skynet_server.c
中会根据队列中是否有消息而重新压入全局消息队列) - 没有消息的时候,如何保证不会重新被压入全局消息队列?答案是 -> 在拿次级消息队列的消息时,如果是空的,则会根据返回值拿下一个次级消息队列,那么当前的消息队列就不会被后续压入全局消息队列了,且
in_global
变量被设置为了 0.
- 从全局消息队列中将次级消息队列取出来的时候,in_global 是否需要设置为 0 ? 因为此时已经不在全局队列中了(但是根据注释是不需要的,因为 1 用来同时表达
暴露出来的自己的不足
都需要练习~
这些不足其实在<Advanced Programming in the Unix Environment>一书中有论述,而这些应该是念大学的时候就应该搞定的,到目前为止,脱了五年了...shit. -> 2023-04-15 14:32:20 星期六
- 没有实际写过多线程程序,所以,理解多线程代码缺少基础认知,导致有些困难。先看看GNU 上面关于多线程如何写. Multithreading
- 了解两个锁,spin 锁 和 mutex 锁 和 GCC atomic (原子操作).
multithreading
- 最好的选择是 posix API. (skynet 框架用的也是这个) [文档在这里](https://www.gnu.org/software/gnulib/manual/html_node/POSIX-multithreading.html)
spinlock of <stdatomic.h>
在 skynet 中,作者云风默认使用的是 "stdatomic.h". 这是 c11 标准,是一个原子操作的库. Atomic operations library
更建议使用语言的标准。。。 <stdatomic.h>
有点复杂,关于
stdatomic.h
能参考的资料没找到,先学习 多线程接口 pthread 提供的锁 spinlcok (注意,在skynet 中,云风用mutex 替代了spin 当使用 pthread 的时候)