用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
来源:互联网 发布:网络布线好学吗 编辑:程序博客网 时间:2024/05/22 14:06
最近在看linux内核的进程调度算法,也写了不少的内核注释,也参考了鸿哥的单片机框架,代码注释就开源在我的CSDN的git代码库里,有兴趣的可以去瞧瞧。
突发奇想,想到了既然单片机能够实现,那么我用标准C语言同样也可以实现,试了一下,真的可以!!这让我如获至宝!
在UNIX和linux还有window中存在着多线程的机制,其实就是把一个任务分成若干个时间片,这样越分越细,执行的效果就好像是在同步在执行,其实这是调度算法在产生效果。如果我们不调用那个所谓的pthread函数,用标准C模拟这样的效果,完全能够做到,可以做到多任务同时执行,从开始到结束,都是同时开始,同时结束。
废话不多说,我们上代码,看看就知道了:
#include <stdio.h>#include <stdlib.h>void thread_work1(void);void thread_work2(void); void thread_work3(void);void thread_work4(void);void thread_work5(void);void thread_work6(void);void delay(void);int main(void){static int i = 5 ;static int j ;static int k ;while(1){printf("---------------第%d次调度开始-----------------\n",++j);putchar('\n');putchar('\n');thread_work1();thread_work2();thread_work3();thread_work4();thread_work5();putchar('\n');putchar('\n');printf("---------------第%d次调度完成-----------------\n",++k);putchar('\n');if(i > 0){i-- ;if(i == 0)break; }}return 0 ;}void thread_work1(void){printf("任务一:\n");delay();static int type = 0; static long int i = 5;printf("i的值:%d\n",i) ;switch(type){case 0 : if(i > 0) i-- ; printf("type 0 :i=%d\n",i); type = 1 ; break ; case 1 : if(i > 0) i-- ; printf("type 1 :i=%d\n",i); type = 0 ; break ;}}void thread_work2(void){printf("任务二:\n");delay();static int type = 0 ; static long int i = 5 ;printf("i的值:%d\n",i) ; switch(type){case 0 :if(i > 0)i-- ;printf("type 0 :i=%d\n",i);type = 1 ;break ;case 1 : if(i > 0) i-- ; printf("type 1 :i=%d\n",i);type = 0 ; break ;}}void thread_work3(void){printf("任务三:\n");delay();static int type = 0 ; static long int i = 5 ; printf("i的值:%d\n",i) ;switch(type){case 0 :if(i > 0)i-- ;printf("type 0 :i=%d\n",i);type = 1 ;break ;case 1 : if(i > 0) i-- ; printf("type 1 :i=%d\n",i);type = 0 ; break ;}}void thread_work4(void){printf("任务四:\n");delay();static int type = 0 ; static long int i = 5; printf("i的值:%d\n",i) ;switch(type){case 0 :if(i > 0)i-- ;printf("type 0 :i=%d\n",i);type = 1 ;break ;case 1 : if(i > 0) i-- ; printf("type 1 :i=%d\n",i);type = 0 ; break ;}}void thread_work5(void){printf("任务五:\n");delay();static int type = 0 ; static long int i = 5; printf("i的值:%d\n",i) ;switch(type){case 0 :if(i > 0)i-- ;printf("type 0 :i=%d\n",i);type = 1 ;break ;case 1 : if(i > 0) i-- ; printf("type 1 :i=%d\n",i);type = 0 ; break ;}}void delay(void){long int i = 0xffffff ;while(i > 0)i-- ; }我们看到,上面的5个任务其实是在执行同一个操作,就是将5减到0的操作,一些初学者可能会想,函数不是执行完一个,然后再执行下一个吗?那么我们看看运行结果,这会让你大吃一惊,事实就是这样,不信咱们看看:
看到最后的结果,是否觉得很神奇?其实关键就是每个函数里的static这个关键字,它保留了执行完上一次数值的状态,再者就是每个函数中都有一个switch的分支,这样的分支就实现了轮流切换。在我的代码里,该代码经过5次调度完成后,数值从5变为0,而且每一个任务都是实现单独运行,却没有相互干扰,正是这样的机制,运用到单片机和裸板上,这无非就是一种非常好的框架!!!
1 0
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
- Js实现多张图片无规律的轮流切换
- 使用python的yield实现任务调度.给定一个任务列表,每个任务轮流切换执行,类似于切片
- 多任务操作系统的任务切换
- c语言线程池的简单实现
- C语言实现简单的线程池
- 操作系统课程设计--基于线程的多任务系统的实现
- 简单的文件系统模拟C/C++(操作系统)
- 【操作系统】C语言模拟操作系统实现动态分区分配算法
- 简单的多任务操作系统
- 一个简单的32位多任务操作系统的实现
- 一个简单的32位多任务操作系统的实现
- 一个简单的32位多任务操作系统的实现
- 操作系统的进程管理(c语言模拟)
- 大家一起写操作系统(4)-简单的任务切换
- js实现轮流切换图片
- 简单分析操作系统的中断机制与进程上下文切换
- 学生信息管理系统简单模拟(C语言实现)
- hdu 2501--Tiling_easy version
- POJ 1505 Copying Books
- 将数据写入.txt文件中
- iOS学习之路-图片轮播(UIScrollerView)
- 设计模式学习笔记-观察者模式
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
- 细说UI线程和Windows消息队列
- jpa查询所有的记录
- Visual format language(2)
- hdu 2046 骨牌铺方格
- cocos2dx 3.3 AssetsManager简单分析
- MySql数据库(二)
- QQ SDK 分享实现,及不回调问题
- windows 多线程 消息队列