我是靠谱客的博主 健康母鸡,这篇文章主要介绍c/c++ 消息队列(循环数组实现),现在分享给大家,希望可以做个参考。

         --未设置访问控制,多线程或者多进程使用需要加互斥锁保护。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
typedef struct _tagFIFO_QUE { void* cycleQue;//队列的起始地址 long long front;//队列的头偏移 long long rear;//队列的尾偏移 unsigned long maxLen;//元素的最大数量*元素的大小,也就是cycleQue指针指向的内存空间大小 }FIFO_QUE, *LPFIFO_QUE; LPFIFO_QUE CreateCycleQue(unsigned long size) { LPFIFO_QUE que = (LPFIFO_QUE)malloc(sizeof(FIFO_QUE)); if(que==NULL) return NULL; que->front = 0; que->rear = 0; que->maxLen = size + 1; que->cycleQue = malloc(que->maxLen); if(que->cycleQue==NULL) { free(que); return NULL; } return que; } void DestoryCycleQue(LPFIFO_QUE que) { if(que->cycleQue!=NULL) { free(que->cycleQue); } free(que); } bool IsQueEmpty(LPFIFO_QUE que) { if (que->front == que->rear) { return true; } else return false; } bool IsQueFull(LPFIFO_QUE que) { if ((que->rear + 1)%que->maxLen == que->front) { return true; } else return false; } unsigned long GetWritableSize(LPFIFO_QUE que) { if (que->rear - que->front >= 0) { return que->maxLen - (que->rear - que->front) - 1; } else { return que->front - que->rear - 1; } } bool EnQue(LPFIFO_QUE que, void* msg, DWORD msg_size) { if (IsQueFull(que)) return false; if (GetWritableSize(que) < msg_size) { return false; } if (que->rear + msg_size > que->maxLen) { long long part1 = msg_size - (que->rear + msg_size) % que->maxLen; memcpy((char*)que->cycleQue + que->rear, msg, part1); que->rear = (que->rear + part1) % que->maxLen; memcpy((char*)que->cycleQue + que->rear, (char*)msg+part1, msg_size-part1); que->rear = (que->rear + msg_size - part1) % que->maxLen; } else { memcpy((char*)que->cycleQue+que->rear, msg, msg_size); que->rear = (que->rear + msg_size) % que->maxLen; } return true; } unsigned long GetReadableSize(LPFIFO_QUE que) { if (que->rear - que->front >= 0) return (unsigned long)(que->rear - que->front); else return que->maxLen + que->rear - que->front; } bool DeQue(LPFIFO_QUE que, void* plane, unsigned long size) { if (IsQueEmpty(que)) return false; if (GetReadableSize(que) < size) return false; if (que->front + size < que->maxLen) { memcpy((char*)plane, (char*)que->cycleQue + que->front, size); que->front = (que->front + size) % que->maxLen; } else { long long part1 = size - (que->front + size) % que->maxLen; memcpy((char*)plane, (char*)que->cycleQue + que->front, part1); que->front = (que->front + part1)% que->maxLen; memcpy((char*)plane+ part1, (char*)que->cycleQue + que->front, size-part1); que->front = (que->front + size - part1) % que->maxLen; } return true; }

最后

以上就是健康母鸡最近收集整理的关于c/c++ 消息队列(循环数组实现)的全部内容,更多相关c/c++内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部