message_queue

学习过程中,我发现了一扇新的世界,The c standard manual

这里记录文件 skynet_mq.h and skynet_mq.c 的阅读结果.

消息队列

1. 为什么用队列?

因为消息需要先入先出(FIFO).

剩下几个问题:

  1. 如何自己在代码中也使用自旋锁,请写一个示例代码。
  2. 次级消息队列(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.

暴露出来的自己的不足

都需要练习~

这些不足其实在<Advanced Programming in the Unix Environment>一书中有论述,而这些应该是念大学的时候就应该搞定的,到目前为止,脱了五年了...shit. -> 2023-04-15 14:32:20 星期六

  1. 没有实际写过多线程程序,所以,理解多线程代码缺少基础认知,导致有些困难。先看看GNU 上面关于多线程如何写. Multithreading
  2. 了解两个锁,spin 锁mutex 锁 和 GCC atomic (原子操作).

multithreading

choosing a multithreading API

  1. 最好的选择是 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 的时候)

posted @ 2024-09-30 13:24  yinchao_ws  阅读(4)  评论(0编辑  收藏  举报