环状同步造成的死锁问题
发布日期:2021-07-01 04:27:30
浏览次数:2
分类:技术文章
本文共 2360 字,大约阅读时间需要 7 分钟。
文章目录
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));}
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/105733899 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月15日 09时29分13秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
学习Linux必备的硬件基础一网打尽
2019-05-03
std::exception标准和各平台实现的不同
2019-05-03
C++的匿名对象
2019-05-03
C++中class和typename的区别
2019-05-03
C++常量表达式、const、constexpr(C++11新增)的区别
2019-05-03
printf,wprintf与setlocale,char与wchar_t区别
2019-05-03
关于栈、堆、静态存储区最大可分配大小的探讨
2019-05-03
数据库并发控制技术
2019-05-03
bfptr算法(即中位数的中位数算法)
2019-05-03
socket为什么要翻译成套接字?
2019-05-03
为什么ICMP的ping和tracert不经过tcp或udp?
2019-05-03
调用约定__cdecl、__stdcall和__fastcall的区别
2019-05-03
程序,进程,线程的区别和联系
2019-05-03
孤儿进程与僵尸进程[总结]
2019-05-03
Windows和Linux进程与线程的区别
2019-05-03
Windows下C++多线程编程(入门实例)
2019-05-03
宽字符标量L"xx"在VC6.0/7.0和GNU g++中的不同实现。
2019-05-03
VS工程属性“字符集”和源文件“高级保存选项”字符集区别
2019-05-03
Linux下C++多线程编程(入门实例)
2019-05-03
深入理解HashMap
2019-05-03