1

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

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

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

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

是控制台“满了”,而 borland 的行为很奇怪吗?有什么问题?

4

2 回答 2

1

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

于 2012-09-04T18:47:01.067 回答
0

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

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

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

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

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

于 2012-09-04T04:33:22.113 回答