文章目录

  • 1 环状同步造成的死锁问题

1 环状同步造成的死锁问题

竞争资源造成的死锁:

环路等待事件引发死锁:

示例代码如下:

/*** @brief tOS应用示例* @details* @author 01课堂 李述铜 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版权所有,禁止用于商业用途*/
#include "tinyOS.h"
#include "app.h"
#include "hal.h"static tTask task1;                     // 任务1结构
static tTask task2;                     // 任务2结构
static tTask task3;                     // 任务3结构
static tTask task4;                     // 任务4结构static tTaskStack task1Env[TASK1_ENV_SIZE];     // 任务1的堆栈空间
static tTaskStack task2Env[TASK2_ENV_SIZE];     // 任务2的堆栈空间
static tTaskStack task3Env[TASK3_ENV_SIZE];     // 任务3的堆栈空间
static tTaskStack task4Env[TASK4_ENV_SIZE];     // 任务4的堆栈空间int task1Flag;           // 用于指示任务运行状态的标志变量
int task2Flag;           // 用于指示任务运行状态的标志变量
int task3Flag;           // 用于指示任务运行状态的标志变量
int task4Flag;           // 用于指示任务运行状态的标志变量tSem task1WaitSem;
tSem task2WaitSem;
tSem task3WaitSem;/*** 任务的运行代码* @param param 任务初始运行参数*/
void task1Entry (void *param) {for (;;) {tSemWait(&task1WaitSem, 0);task1Flag = 1;tTaskDelay(1);tSemNotify(&task2WaitSem);task1Flag = 0;tTaskDelay(1);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task2Entry (void *param) {for (;;) {tSemWait(&task2WaitSem, 0);task2Flag = 1;tTaskDelay(1);tSemNotify(&task3WaitSem);task2Flag = 0;tTaskDelay(1);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task3Entry (void *param) {for (;;) {tSemWait(&task3WaitSem, 0);task2Flag = 1;tTaskDelay(1);tSemNotify(&task1WaitSem);task2Flag = 0;tTaskDelay(1);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task4Entry (void *param) {for (;;) {task4Flag = 1;tTaskDelay(1);task4Flag = 0;tTaskDelay(1);}
}/*** App的初始化*/
void tInitApp (void) {halInit();tSemInit(&task1WaitSem, 0, 1);tSemInit(&task2WaitSem, 0, 1);tSemInit(&task3WaitSem, 0, 1);tTaskInit(&task1, task1Entry, (void *) 0x0, TASK1_PRIO, task1Env, sizeof(task1Env));tTaskInit(&task2, task2Entry, (void *) 0x0, TASK2_PRIO, task2Env, sizeof(task2Env));tTaskInit(&task3, task3Entry, (void *) 0x0, TASK3_PRIO, task3Env, sizeof(task3Env));tTaskInit(&task4, task4Entry, (void *) 0x0, TASK4_PRIO, task4Env, sizeof(task4Env));
}

参考资料:

  1. 手把手教你学用嵌入式操作系统

环状同步造成的死锁问题相关推荐

  1. Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)

    文章目录 一.并发与并行 二.同步与异步 三.线程锁 1.GIL全局解释器锁 2.同步锁 3.死锁 4.递归锁 在Python中GIL解释器锁.同步锁.死锁.递归锁都是什么?怎么这么多锁,它们都是用来 ...

  2. python线程死锁的原因,浅谈Python线程的同步互斥与死锁

    线程间通信方法 1. 通信方法 线程间使用全局变量进行通信 2. 共享资源争夺 共享资源:多个进程或者线程都可以操作的资源称为共享资源.对共享资源的操作代码段称为临界区. 影响 : 对共享资源的无序操 ...

  3. python同步锁和互斥锁的区别_浅谈Python线程的同步互斥与死锁

    这篇文章主要介绍了浅谈Python线程的同步互斥与死锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 线程间通信方法 1. 通信 ...

  4. 字节二面 —— 什么是同步锁、死锁、乐观锁、悲观锁

    马上就要到金三银四佳季了,是找工作的好时候,小伙伴们一定要把握好时机,找到心仪的高薪工作.找工作就少不了面试,那我们从现在开始,多刷刷面试题,查缺补漏!!! 目录 1. 面向对象的特征 2. Java ...

  5. 《Windows via C/C++》学习笔记 —— “线程同步”之“检测死锁”

    本来这篇内容在书中是在"其他线程同步函数"这一节中的.这节中介绍了另外的几个等待函数,比如WaitForInputIdle.MsgWaitForMultipleObjects.Wa ...

  6. JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池...

    /*** 多线程共享数据* 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行.* 多线程共享数据的安全问题,使用同步解决.* 线程同步两种方法: ...

  7. Android(java)学习笔记10:同步中的死锁问题以及线程通信问题

    1. 同步弊端: (1)效率低 (2)如果出现了同步嵌套,就容易产生死锁问题 死锁问题及其代码 : (1)是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象 (2)同步代码块的 ...

  8. Java 编程下的并发线程之间的同步代码块死锁

    并发线程之间的死锁通常发生在同步代码块的相互嵌套使用的过程中,下面先来看段代码: package cn.sunzn.synchronize;public class DeadLock {public ...

  9. Python之路 34:并发与并行、锁(GIL、同步锁、死锁与递归锁)、信号量、线程队列、生消模型、进程(基础使用、进程通信、进程池、回调函数)、协程

    内容: 同步锁 死锁.递归锁 信号量和同步对象(暂时了解即可) 队列------生产者和消费者模型 进程(基础使用.进程通信.进程池.回调函数) 协程 一.并发并行与同步异步的概念 1.1.并发和并行 ...

最新文章

  1. 简单分析MySQL 一则慢日志监控误报问题
  2. 简书mysql配置_MySQL安装配置
  3. 切割图形_3D打印、激光切割、图形化编程,六一科普活动喊你来报名啦!
  4. Redis缓存与数据库双写一致性
  5. 使用经过oauth验证后的github API,避免调用频次超标的问题
  6. 1-5分层API(Layered APIs)
  7. squid3.0缓存服务器编译安装
  8. android跨进程关闭服务器,Android IPC机制(五)用Socket实现跨进程聊天程序
  9. [Java] 蓝桥杯BASIC-27 基础练习 2n皇后问题
  10. mysql8.0登录不上去怎么回事_速看!智慧团建系统登录平台及信息查询入口
  11. UVA10324 Zeros and Ones【水题】
  12. github 分支 合并
  13. CAD中 OLE不能旋转_【设计图文】大空间旋转喷头零件的数控加工工艺设计、编程与加工(有全套cad图+程序+中英文翻译)...
  14. 波士顿房价数据集——随机森林
  15. 尚硅谷宋红康java基础学习笔记
  16. 监视Python程式自动退出,并重新启动程式
  17. 获取U盘 VID,PID
  18. 卡口和电子警察的区别
  19. 【起航计划ObjC 002】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用MAC虚拟机
  20. JavaScript学习笔记(三)---事件、正则表达式、ES6、运动

热门文章

  1. java弱引用怎么手动释放,Java 如何有效地避免OOM:善于利用软引用和弱引用
  2. 技术方案包括哪些内容_揭秘:网络营销推广方案的内容包括哪些?
  3. 【数理知识】《矩阵论》方保镕老师-第5章-矩阵微积分及其应用
  4. 1.7 对新序列采样-深度学习第五课《序列模型》-Stanford吴恩达教授
  5. 3.5 梯度校验-机器学习笔记-斯坦福吴恩达教授
  6. 深入理解Java虚拟机——读书笔记01
  7. 【S操作】一个简单粗暴易用的远程调试方案——OTA http update
  8. 数字预失真技术基本原理
  9. 如何在Linux中恢复一个删除了的文件
  10. Error:(108) No resource identifier found for attribute #39;style#39; in package #39;android#39;