中断处理程序不能使用printf的本质 分类: vxWorks ...

vxworks 中断处理程序之所以不用printf,本质在于printf是将信息输出到标准输出设备(STDOUT)中, 整个标准输出设备是一个全局变量,由于有semTake操作,那么就会发生阻塞,vxworks属于硬实时操作系统,不能在规定的时间内完成操作即会死机或复位。所以vxworks不用printf的原因在于阻塞。 网上说printf 因为引用全局变量stdout,所以是不可重入的。这个稍微解释一下。如果用到了全局变量,但是用信号量保护,是线程安全的,但是不可重入的(会导致死锁,譬如一个任务或中断处理程序调用了printf,被另一个高优先级中断打断,那么就会形成死锁而导致系统复位)。 所以这里的阻塞和不可重入都是因为对共享变量的保护而采用互斥锁引起的,而这里的阻塞是不可重入的一个真子集。(例如:可能有些函数对静态或全局变量没有锁保护,因此是非线程安全,也是非可重入的,此时并没有阻塞在静态或全局变量上,所以不可重入的概念要大。)。因此printf不能用在中断处理程序中的根本原因在于使用了全局变量后采用了锁机制,而锁机制会导致阻塞,阻塞是不可重入的真子集。 所以网上说printf因为不可重入,也会说得过去的(但不可重入还有其他非阻塞的场景)。更准确的说法是因为阻塞在全局变量STDOUT上)。关于可重入和线程安全的区别,下文会有详细解释:


线程安全函数
• 概念:
线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。
• 确
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值