【发布时间】:2017-04-27 14:49:56
【问题描述】:
观察是- 2 个线程 a 和 b 一个接一个地创建。线程 b 所需的堆栈大小是分配的堆栈大小的三倍。 线程 b 的执行使用/破坏了分配给线程 a 的堆栈。现在当线程 a 执行时,操作系统给出堆栈溢出错误。
注意:新函数被添加到线程 b。没有新函数在线程 a 的上下文中执行。
使用的 RTOS 是 embOS。
这种情况可能吗?或者在这种情况下对观察结果的解释可能是错误的?我怎样才能知道?
【问题讨论】:
-
使用比您分配的堆栈多三倍的堆栈基本上可以在 any 场景中结束,因为这将触发完全未定义的行为。其中之一可能是您描述的那个。其他 99.999999% 是简单的崩溃、重新启动,无论迟早。我觉得你的情况不太可能,但有可能。
-
“IT”如何检测(并报告)stackoverflow?还有,这是什么”?你编译过堆栈溢出保护吗?
-
@old_timer,问题已更新
-
@tofro:我不知道,给定的场景对我来说听起来并不那么难以置信。线程 B 大量过度分配并丢弃到下一个线程的连续分配的堆栈区域。在随后的上下文切换回线程 A 时,操作系统会注意到一个废弃的堆栈金丝雀并退出,直到那时,除非通过直接从线程 A 传递的堆栈分配缓冲区执行 IPC,否则不会发生太多崩溃。
-
@doynax 使用 3 倍于分配的堆栈可能会比其他任务的堆栈覆盖更多,假设它以相似的大小分配 - 这就是我想说的。跨度>