无等待地从一个消息队列中取得消息, OSQAccept()
来源:互联网 发布:adc0804连单片机 编辑:程序博客网 时间:2024/06/05 06:35
如果试图从消息队列中取出一条消息,而此时消息队列又为空时,也可以不让调用任务等待而直接返回调用函数。这个操作可以调用OSQAccept()函数来完成。程序清单 L6.25是该函数的源代码。OSQAccept()函数首先查看pevent指向的事件控制块是否是由OSQCreate()函数建立的[L6.25(1)],然后它检查当前消息队列中是否有消息[L6.25(2)]。如果消息队列中有至少一条消息,那么就从.OSQOut指向的单元中取出消息[L6.25(3)]。OSQAccept()函数的调用函数需要对OSQAccept()返回的指针进行检查。如果该指针是NULL值,说明消息队列是空的,其中没有消息可以 [L6.25(4)]。否则的话,说明已经从消息队列中成功地取得了一条消息。当中断服务子程序要从消息队列中取消息时,必须使用OSQAccept()函数,而不能使用OSQPend()函数。程序清单 L6.25 无等待地从消息队列中取一条消息void *OSQAccept (OS_EVENT *pevent){ void *msg; OS_Q *pq; OS_ENTER_CRITICAL(); if (pevent->OSEventType != OS_EVENT_TYPE_Q) { (1) OS_EXIT_CRITICAL(); return ((void *)0); } pq = pevent->OSEventPtr; if (pq->OSQEntries != 0) { (2) msg = *pq->OSQOut++; (3) pq->OSQEntries--; if (pq->OSQOut == pq->OSQEnd) { pq->OSQOut = pq->OSQStart; } } else { msg = (void *)0; (4) } OS_EXIT_CRITICAL(); return (msg);}
0 0
- 无等待地从一个消息队列中取得消息, OSQAccept()
- 无等待地从一个消息队列中取得消息, OSQAccept()
- 无等待地从邮箱中得到一个消息, OSMboxAccept()
- 无等待地从邮箱中得到一个消息, OSMboxAccept()
- 等待一个消息队列中的消息,OSQPend()
- 一个无锁消息队列引发的血案(三)——地:q3.h 与 RingBuffer
- 一个无锁消息队列引发的血案(三)——地:q3.h 与 RingBuffer
- linux中消息队列
- 将消息推入消息队列并从消息队列中取出------利用异质链表和C++的多态性
- 从线程的队列中提取消息的算法
- 等待一个邮箱中的消息,OSMboxPend()
- 建立一个消息队列,OSQCreate()
- 一个Redis消息队列实现
- 云风的无锁消息队列
- 无锁消息队列【好文转载】
- 多线程安全无锁消息队列
- 201200816-用GetMessage()从消息队列中取出1条消息
- skynet源码学习 - 从全局队列中弹出/压入一个消息队列过程
- BZOJ 2820 YY的GCD
- MySQL的读写分离之Amoeba
- ubuntu 下 anaconda 安装插件
- Ubuntu安装oh-my-zsh
- 机器学习 1.回归
- 无等待地从一个消息队列中取得消息, OSQAccept()
- 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
- UI设计原则 Material Design
- 卡拉兹(Callatz)猜想
- 浅谈Java内部类的四个应用场景
- android 阴影效果
- 把本地项目提交到 github 上
- Js bug 小结
- 51nod 1393 0和1相等串