IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 搜狗workflow项目研究(八)消息队列 -> 正文阅读

[数据结构与算法]搜狗workflow项目研究(八)消息队列

2021SC@SDUSC

目录

一、基本接口

二、初始化

?三、put数据

四、get数据

五、数据结构


一、基本接口

msgqueue_t *msgqueue_create(size_t maxlen, int linkoff);
void msgqueue_put(void *msg, msgqueue_t *queue);
void *msgqueue_get(msgqueue_t *queue);
void msgqueue_set_nonblock(msgqueue_t *queue);
void msgqueue_set_block(msgqueue_t *queue);
void msgqueue_destroy(msgqueue_t *queue);

*msgqueue_create:创建消息队列

msgqueue_put:put数据

*msgqueue_get:get数据

msgqueue_set_nonblock:设置存放数据方式为非堵塞

msgqueue_set_block:设置存放数据方式为堵塞

msgqueue_destroy:销毁消息队列

二、初始化

msgqueue_t *msgqueue_create(size_t maxlen, int linkoff);

在信息列表初始化的时候,需要指定最大消息数量和消息头部偏移量。其中maxlen为最大消息数量,linkoff为消息头部偏移量。

消息头部偏移量主要是为了利用msg头部偏移后的空间,来形成链表。

一个常规的消息队列节点:

struct Node {
	void* your_message;
	Node* next;
};

在这里没有指定节点内容,而是使用了msg头部偏移后的空间,因此在使用的时候,该偏移量的后部需要保留一个指针大小的空间。具体可见下图:

?三、put数据

放数据时分为堵塞和非堵塞两种形式,默认为堵塞。

?堵塞情况:在放数据的时候,如果目前消息队列已超过设定的最大值,那么就等待信息被消费。

非堵塞情况:如果设置了非堵塞,则会释放get_cond和put_cond,通知目前堵塞的线程继续往下执行。此时用户设置的最大值不再生效,会继续向消息队列中放入数据。

void msgqueue_set_nonblock(msgqueue_t *queue)
{
	queue->nonblock = 1;
	pthread_mutex_lock(&queue->put_mutex);
	pthread_cond_signal(&queue->get_cond);
	pthread_cond_broadcast(&queue->put_cond);
	pthread_mutex_unlock(&queue->put_mutex);
}

四、get数据

如果当前队列中有数据,直接读取队列中下一个数据。如果当前队列中没有数据,返回空,设置错误码。

get数据时,返回数据的头部。

void *msgqueue_get(msgqueue_t *queue)
{
	void *msg;

	pthread_mutex_lock(&queue->get_mutex);
	if (*queue->get_head || __msgqueue_swap(queue) > 0)
	{
		// 获取消息头部
        msg = (char *)*queue->get_head - queue->linkoff;
        // 将头部移动到下一个元素上
		*queue->get_head = *(void **)*queue->get_head;
	}
	else
	{
		msg = NULL;
		errno = ENOENT;
	}

	pthread_mutex_unlock(&queue->get_mutex);
	return msg;
}

五、数据结构

struct __msgqueue {
	size_t msg_max;
	size_t msg_cnt;

	// 消息的偏移量
	int linkoff;
	// 是否为堵塞
	int nonblock;

	// 消息队列的两个头部
	void *head1;
	void *head2;

	// get 队列
	void **get_head;

	// put 队列头部和尾部
	void **put_head;
	void **put_tail;

	// 锁
	pthread_mutex_t get_mutex;
	pthread_mutex_t put_mutex;
	pthread_cond_t get_cond;
	pthread_cond_t put_cond;
};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:35:49  更:2021-11-22 12:37:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:31:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码