使用一个消息队列作为计数信号量
2017-04-18 08:58
190 查看
在消息队列初始化时,可以将消息队列中的多个指针设为非NULL值(如void* 1),来实现计数信号量的功能。这里,初始化为非NULL值的指针数就是可用的资源数。系统中的任务可以通过OSQPend()来请求“信号量”,然后通过调用OSQPost()来释放“信号量”,如程序清单 L6.28。如果系统中只使用了计数信号量和消息队列,使用这种方法可以有效地节省代码空间。这时将OS_SEM_EN设为0,就可以不使用信号量,而只使用消息队列。值得注意的是,这种方法为共享资源引入了大量的指针变量。也就是说,为了节省代码空间,牺牲了RAM空间。另外,对消息队列的操作要比对信号量的操作慢,因此,当用计数信号量同步的信号量很多时,这种方法的效率是非常低的。 程序清单 L6.28 使用消息队列作为一个计数信号量 OS_EVENT *QSem; void *QMsgTbl[N_RESOURCES] void main (void) { OSInit(); . . QSem = OSQCreate(&QMsgTbl[0], N_RESOURCES); for (i = 0; i < N_RESOURCES; i++) { OSQPost(Qsem, (void *)1); } . . OSTaskCreate(Task1, .., .., ..); . . OSStart(); } void Task1 (void *pdata) { INT8U err; for (;;) { OSQPend(&QSem, 0, &err); /* 得到对资源的访问权 */ . . /* 任务获得信号量,对资源进行访问 */ . OSMQPost(QSem, (void*)1); /* 释放对资源的访问权 */ } }
相关文章推荐
- 如何使用NODEJS+REDIS开发一个消息队列
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- 0904使用msgget函数创建一个消息队列,并返回该消息队列的描述符
- 使用NODEJS+REDIS开发一个消息队列以及定时任务处理
- uC/OS-II 学习笔记之:信号量、消息邮箱、消息队列之间的使用区别
- 0905使用msgsnd函数向消息队列中发送一个字符串数据信息“Hello!This is a te
- 使用redis list作为消息队列
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- 为什么使用ZeroMQ作为消息队列
- php使用redis作为消息队列
- Kafka,Mq,Redis作为消息队列使用时的差异?
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- redis作为消息队列的使用
- 使用Redis作为消息队列服务场景应用案例
- redis作为消息队列的使用
- 使用 Kafka 和 Redis 作为消息队列的差异
- Kafka,Mq,Redis作为消息队列使用时的差异?
- Qt使用一个事件队列对所有发出的事件进行维护(QObject的event()函数相当于dispatch函数),用EventLabel 继承QLabel作为例子(简单明了) good
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)