首页 > 其他分享 >message_queue

message_queue

时间:2024-09-30 13:25:32浏览次数:7  
标签:队列 global queue 消息 skynet message 全局

学习过程中,我发现了一扇新的世界,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 的时候)

标签:队列,global,queue,消息,skynet,message,全局
From: https://www.cnblogs.com/yinchaows/p/18214450

相关文章

  • C++学习:stack queue模拟
    stack和queue可以复用其他容器的函数如dequevector这两个是空间适配器,所以都没有迭代器一:stack模拟namespacebit{ template<classT,classContainer=deque<T>> classstack { public: voidpush(constT&x) { _con.push_back(x); } voidpop() ......
  • 使用MessagePipe实现进程间通信
    使用MessagePipe实现进程间通信 1、MessagePipe介绍可以用于.NET和Unity上面的高性能的内存/分布式消息传递管道。适用于发布/订阅模式、CQRS的中介模式、Prism中的EventAggregator、IPC(进程间通信)-RPC等。支持:依赖注入过滤器管道更好的事件同步/异步带键值的/无键值......
  • [Java基础]PriorityQueue
    优先级队列数据结构是堆一.PriorityQueuePriorityQueue简介继承关系PriorityQueue示例二.Comparable比较器Compare接口三.Comparator比较器Comparator接口四.底层原理一.PriorityQueuePriorityQueue简介PriorityQueue,即优先级队列。优先级队列可以保证......
  • 【漏洞复现】孚盟云oa AjaxSendDingdingMessage接口 存在sql注入漏洞
    》》》产品描述《《《        孚盟与阿里强强联手将最受青睐的经典C系列产品打造成全新的孚盟云产品,让用户可以用云模式实现信息化管理,让用户的异地办公更加流畅,大大降低中小企业在信息化上成本,用最小的投入享受大型企业级别的信息化服务,使中小企业在网络硬件环境、......
  • 【JUC并发编程系列】深入理解Java并发机制:阻塞队列详解与简单纯手写(七、BlockingQueu
    文章目录【JUC并发编程系列】深入理解Java并发机制:阻塞队列详解与简单纯手写(七、BlockingQueue、ArrayBlockingQueue、LinkedBlocking)1.简单回顾1.1数组结构和链表结构1.1.1数组结构1.1.2链表结构1.2有界队列与无界队列1.3Lock锁使用回顾2.什么是阻塞队列3.B......
  • RabbitMQ通讯方式第二讲:Work Queues
    了解WorkQueues  1.1官网中的图片:通过官网里的图片,我们可以看到WordQueues与HelloWorld的区别,这里的消费者增加,但是时多个消费者消费单个队列,在这里我们依然要注意,这里面使用的是默认的交换机,并不是直接连接的队列。  1.2直观的图片:更好的理解每次的连接都是......
  • ConcurrentLinkedQueue详解(图文并茂)
    前言ConcurrentLinkedQueue是基于链接节点的无界线程安全队列。此队列按照FIFO(先进先出)原则对元素进行排序。队列的头部是队列中存在时间最长的元素,而队列的尾部则是最近添加的元素。新的元素总是被插入到队列的尾部,而队列的获取操作(例如poll或peek)则是从队列头部开始。与传统的L......
  • ConcurrentLinkedQueue详解(图文并茂)
    前言ConcurrentLinkedQueue是基于链接节点的无界线程安全队列。此队列按照FIFO(先进先出)原则对元素进行排序。队列的头部是队列中存在时间最长的元素,而队列的尾部则是最近添加的元素。新的元素总是被插入到队列的尾部,而队列的获取操作(例如poll或peek)则是从队列头部开始。与传统的......
  • WPF System.Windows.MessageBox.Show Dispatcher processing has been suspended, bu
    privatevoidSelectedCommandExecuted(objectobj){if(obj!=null&&objisDataGriddg){if(dg!=null){varselectedBks=dg.SelectedItems;if(selectedBks!=null&&selectedBk......
  • stack - queue
    1.容器适配器(1)什么是适配器?适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口(2) STL标准库中stack和queue的底层结构 虽然stack和queue中也可以存......