您好、欢迎来到现金彩票网!
当前位置:皮皮彩票app下载 > 共享变量 >

第60节:用关中断和互斥量来保护多线程共享的全局变量

发布时间:2019-06-06 23:45 来源:未知 编辑:admin

  在前面一些章节中,我提到为了防止中断函数把某些共享数据破坏,在主函数中更改某个数据变量时,应该先关闭中断,修改完后再打开中断;我也提到了网友“红金龙吸味”关于原子锁的建议。经过这段时间的思考和总结,我发现不管是开中断,还是原子锁,其实本质上都是程序在多进程中临界点的数据处理,原子锁有个专用名词叫,而我引以为豪的状态机程序框架,主函数的switch语句,外加一个定时中断,本质上就是2个独立进程在不断切换并行运行。

  为什么要保护多线程共享的全局变量?因为,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数据是经过写线程修改后的。

  这一节要教大家一个知识点:如何用关中断和互斥量来保护多线程共享的全局变量。

  在第5节的基础上略作修改,让蜂鸣器在前面3秒发生一次短叫报警,在后面6秒发生一次长叫报警,如此反复循环。

  * 多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,

  * 而其他线程负责同时读取变量内容,则不能保证读取到的数据是经过写线程修改后的。

  * 鸿哥的基本程序框架都是两线程为主,一个是main函数线程,一个是定时函数线程。

  * 实际上经过编译之后它不只一条汇编指令。由于另外一个定时中断线程里也会对这个变量

  * 进行判断和操作,如果不禁止定时中断或者采取其它措施,定时函数往往会在主函数还没有

  * 结束操作共享变量前就去访问或处理这个共享变量,这就会引起冲突,导致系统运行异常。

  uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫

  ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。

  从下一节开始我准备用几章节的内容来讲常用的数**算程序。这些程序经常要用在计算器,工控,以及高精度的仪器仪表等领域。C语言的语法中不是已经提供了+,-,*,/这些运算符号吗?为什么还要专门写算法程序?因为那些运算符只能进行简单的运算,一旦数据超过了unsigned long(4个字节)的范围就会出错。而这种大数据算法的程序是什么样的?欲知详情,请听下回分解----大数据的加法运算。

http://divasrun.com/gongxiangbianliang/447.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有