【问题标题】:Borland C++ crashes without a messageBorland C++ 在没有消息的情况下崩溃
【发布时间】:2014-02-20 08:52:08
【问题描述】:

我不确定是否有人使用 Borland c++ 3.1,但我必须这样做。

我有一个程序,它实现简单的线程并通过定时器中断改变这些线程的上下文。

我有一个无限循环和 2 个线程,它们可以完成它们的工作并在彼此和主线程之间切换。他们的工作是产生一些输出,在控制台上写一些东西。 问题是每次我运行程序时,都会发生不同的事情。

有时它会工作半分钟,然后就停止写它应该写的东西。写只是停止并且没有错误并且borland不会崩溃。 有时它会停止并且 borland 在没有消息的情况下崩溃。 有时它会停止并且 borland 崩溃并显示“非法指令”消息 有时在它停止之前写的最后一行是一些不应该在输出中的奇怪字符。

是不是控制台“满了”而 borland 的行为很奇怪? 可能是什么问题?

【问题讨论】:

  • Borland c++ 3.1 1992年发布...有的SO用户还没出生,为什么还要用这么老的编译器?
  • 您所描述的表明代码不是线程安全的。但是没有看到任何崩溃的代码,我只能猜测它有什么问题。 en.wikipedia.org/wiki/Thread_safety
  • 如果我错了,请原谅我,但你是在拖钓吗?
  • @JesseGood 因为老师是这么说的?因为您无法在 Windows/Linux/MacOS 上使用更好的编译器轻松完成相同类型的低级操作,但在裸机或模拟器上的 DOS 上仍然可以?
  • 因为我必须制作带有信号量和事件的小型 16 位多线程操作系统,并且由于某种原因我们必须使用 bcc 编译器,所以为此编写了老师的测试,我猜他没有时间改变该项目的概念并使其更高级:) 我不是拖钓

标签: c++ crash borland-c++


【解决方案1】:

如果我没记错的话,在 DOS 下从中断调用时写入控制台(或使用文件 I/O)是不安全的。要正确执行此操作,您必须检查称为“DOS 重新进入标志”的内容,并且仅在为零时才写入控制台(请参阅http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH18/CH18-3.html 或搜索网络以获取更多信息)

【讨论】:

  • 问题是 cout
【解决方案2】:

在真实和虚拟 8086 模式下,程序不会相互保护。所以,如果你的程序搞砸了,例如:

  1. 覆盖不属于它的内存(或不属于它本身的适当线程),包括由于程序或其 ISR 中的堆栈溢出导致的内存损坏
  2. 未能在其任何 ISR 中保留(=保存,然后恢复)CPU 寄存器
  3. 将硬件状态更改为系统其他部分无法预料的状态
  4. 以其他系统方式明显改变定时器频率

如果它这样做了,那么发生崩溃、挂起或以其他方式行为不端也就不足为奇了。

我猜您遇到了上述问题 1 和/或 2。你也可以在那里有一个竞争条件。

很遗憾,没有看到您的任何代码,我们无法提供更多帮助。想想看,这就像通过电话治疗一个新病人。

【讨论】:

  • 对不起代码,但它太长了,我不确定错误在哪里,所以我不得不全部粘贴。老实说,我不相信有人会读到:)
猜你喜欢
  • 1970-01-01
  • 2016-03-19
  • 2021-02-16
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2015-12-08
相关资源
最近更新 更多