循环消息队列
拿下面为例子
结构
结构图
OS_Q结构相当于循环队列的指针
m_video_qmem是循环队列所占的具体空间
相关函数
OSQPost
向队列中post一个成员,尾指针tail加一
参数
OS_Q* pq 指针变量
void* pmsg 待post的数据
返回值
post情况:若队列满了就返回FULL, 否则返回0表示成功
实现
注意
- 在对OS_Q变量进行操作的时候,要对其进行加锁的操作,防止被其他进程使用造成错误
- pthread_cond_signal作用是给pend中的条件锁发解锁信号
OS_QPend
弹出head指向的成员
如果队列不空, 则直接弹出
如果队列为空, 如果规定时间了, 则等待规定的时间再弹出, 否则等待收到信号再弹出
参数
- OS_Q* pq指针变量
- int millisecond_time 等待的时间
- int *perr 错误类型
返回值
弹出成员的data
实现
如果队列不为空
如果队列为空
注意
关于其中cond条件变量的使用,参照 [LINUX]互斥锁
OSQAccept
接收队列中head指向的元素
如果队列不为空, 则直接返回成员的data
如果队列为空, 则直接返回NULL
参数
OS_Q* pq指针变量
int *perr 错误类型
返回值
成员的data或者NULL
实现
OS_QLen
获取队列的长度
参数
OS_Q* pq 指针变量
返回值
队列长度len
实现