知识卡片
共享数据制造竞争
内容
任务或中断共享同一变量时,读改写可能被打断,导致状态看似偶发地错误。发散:这正是[[裸机也要调度]]后的代价,测试通过只能说明这次没撞上,不说明设计正确。
参考来源
- 位置:《嵌入式系统设计与实践》第5章《任务管理》"5.1.3 避免竞争条件"一节(源文件:_epub-src/OEBPS/text00067.html)
- 结论依据:原文以主循环同时读取两个变量(按钮状态改变标志和按钮值)为例,说明"如果中断在这两个读操作的中间发生,那么它会改变按钮的值",即任何时候任务间共享内存被读写都会产生"关键段",需要互斥保护。
- 原始内容:我们需要方法来阻止多个任务向同一个内存中写。不仅仅写操作出现问题,主循环同时读取两个变量,一个表示按钮状态改变了,一个表示按钮的值。如果中断在这两个读操作的中间发生,那么它会改变按钮的值。任何时候如果任务间共享的内存被读或写了,就会产生一个代码的关键段。