博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
12.RT-Thread生产者消费者问题-IPC对象
阅读量:4101 次
发布时间:2019-05-25

本文共 3410 字,大约阅读时间需要 11 分钟。

生产者消费者问题:线程同步问题

生产者--->产品(带缓冲区)--->消费者

生产者生产产品放到缓冲区,消费者从缓冲区拿产品消费,当缓冲区中产品满了之后,生产者会挂起,只有当消费者消费了一个产品之后,缓冲区产生一个空位,生产者才会继续生产。

对于缓冲区的访问是互斥的,缓冲区满了生产者要挂起,缓冲区空了消费者要挂起。

使用RT-Thread任务同步的相关机制给出一个生产者-消费者模型

/* * 程序清单:信号量例程 * * 该例程创建了一个动态信号量和静态信号量,分别展示了获取信号量超时和获取成功的情况 * */#include 
/* 信号量控制块 */static struct rt_semaphore static_sem;/* 指向信号量的指针 */static rt_sem_t dynamic_sem = RT_NULL;ALIGN(RT_ALIGN_SIZE)static char thread1_stack[1024];static struct rt_thread thread1;static void rt_thread_entry1(void *parameter){ rt_err_t result; rt_tick_t tick; /* 1. staic semaphore demo */ /* 获得当前的OS Tick */ tick = rt_tick_get(); /* 试图持有信号量,最大等待10个OS Tick后返回 */ result = rt_sem_take(&static_sem, 10); if (result == -RT_ETIMEOUT) { /* 超时后判断是否刚好是10个OS Tick */ if (rt_tick_get() - tick != 10) { rt_sem_detach(&static_sem); return; } rt_kprintf("take semaphore timeout\n"); } else { /* 因为没有其他地方释放信号量,所以不应该成功持有信号量,否则测试失败 */ rt_kprintf("take a static semaphore, failed.\n"); rt_sem_detach(&static_sem); return; } /* 释放一次信号量 */ rt_sem_release(&static_sem); /* 永久等待方式持有信号量 */ result = rt_sem_take(&static_sem, RT_WAITING_FOREVER); if (result != RT_EOK) { /* 不成功则测试失败 */ rt_kprintf("take a static semaphore, failed.\n"); rt_sem_detach(&static_sem); return; } rt_kprintf("take a staic semaphore, done.\n"); /* 脱离信号量对象 */ rt_sem_detach(&static_sem); /* 2. dynamic semaphore test */ tick = rt_tick_get(); /* 试图持有信号量,最大等待10个OS Tick后返回 */ result = rt_sem_take(dynamic_sem, 10); if (result == -RT_ETIMEOUT) { /* 超时后判断是否刚好是10个OS Tick */ if (rt_tick_get() - tick != 10) { rt_sem_delete(dynamic_sem); return; } rt_kprintf("take semaphore timeout\n"); } else { /* 因为没有其他地方释放信号量,所以不应该成功持有信号量,否则测试失败 */ rt_kprintf("take a dynamic semaphore, failed.\n"); rt_sem_delete(dynamic_sem); return; } /* 释放一次信号量 */ rt_sem_release(dynamic_sem); /* 永久等待方式持有信号量 */ result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER); if (result != RT_EOK) { /* 不成功则测试失败 */ rt_kprintf("take a dynamic semaphore, failed.\n"); rt_sem_delete(dynamic_sem); return; } rt_kprintf("take a dynamic semaphore, done.\n"); /* 删除信号量对象 */ rt_sem_delete(dynamic_sem);}/* 信号量示例的初始化 */int semaphore_sample_init(){ rt_err_t result; /* 初始化静态信号量,初始值是0 */ result = rt_sem_init(&static_sem, "ssem", 0, RT_IPC_FLAG_FIFO); if (result != RT_EOK) { rt_kprintf("init dynamic semaphore failed.\n"); return -1; } /* 创建一个动态信号量,初始值是0 */ dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_FIFO); if (dynamic_sem == RT_NULL) { rt_kprintf("create dynamic semaphore failed.\n"); return -1; } rt_thread_init(&thread1, "thread1", rt_thread_entry1, RT_NULL, &thread1_stack[0], sizeof(thread1_stack), 11, 5); rt_thread_startup(&thread1); return 0;}/* 如果设置了RT_SAMPLES_AUTORUN,则加入到初始化线程中自动运行 */#if defined (RT_SAMPLES_AUTORUN) && defined(RT_USING_COMPONENTS_INIT) INIT_APP_EXPORT(semaphore_sample_init);#endif/* 导出到 msh 命令列表中 */MSH_CMD_EXPORT(semaphore_sample_init, semaphore sample);

思考:互斥量如何实现?

转载地址:http://bswsi.baihongyu.com/

你可能感兴趣的文章
Objective-C 基础入门(一)
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Flutter Boost的router管理
查看>>
Vue2.0全家桶仿腾讯课堂(移动端)
查看>>
React+Redux系列教程
查看>>
19 个 JavaScript 常用的简写技术
查看>>
iOS开发支付集成之微信支付
查看>>
React非嵌套组件通信
查看>>
浏览器兼容性问题解决方案 · 总结
查看>>
一个很棒的Flutter学习资源列表
查看>>
为什么你应该放弃React老的Context API用新的Context API
查看>>
Koa2初体验
查看>>
Koa 2 初体验(二)
查看>>
Koa2框架原理解析和实现
查看>>
C++模板
查看>>
【C#】如何实现一个迭代器
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
【Unity】微信登录后将头像存为bytes,将bytes读取成sprite图片
查看>>
【Unity】使用GPS定位经纬度
查看>>
最小费用流 Bellman-Ford与Dijkstra 模板
查看>>