在许多讨论同步的例子中,提到了一些效果,“这将在单线程应用程序中工作,但如果是多线程的......”
我感到困惑,因为在我看来,即使在单线程操作中,也可能存在类似于多线程应用程序中提到的问题,但可能非常不可能。
假设您有一个具有状态字段的对象,该字段反映它是否已被放入队列中。伪代码是:object.setStatus(INQUEUE); placeInQueue(对象);
现在,如果以某种方式可以成功设置状态,但下一行代码“静默失败”并且程序继续,我们是否会遇到问题,我们认为该对象在队列中但不是?也许我们可能会发生无声失败的想法是错误的。
但如果以某种方式可能出现上述问题,我们将如何使两行代码始终执行或两者都失败?
答案 0 :(得分:3)
逻辑错误,这是算法中的一个缺陷,可以并且经常在单线程应用程序中发生。如果在算法的单线程实现中存在这样的问题,那么当试图使其成为多线程时,它只会变得更糟。
引用“这将在单线程应用程序中工作,但如果是多线程的......”正在讨论由并发性质引入的一类问题。例如,如果我在厨房自己做蛋糕,我就不必担心碰到另一个酋长。然而,我仍然不得不担心在烤箱上烧手而不是撞到柜台上。
使用队列描述的场景是由磁盘支持的另一个并行示例。即使我们的应用程序逻辑是单线程的,其他进程也可以写入磁盘,而我们的进程正在使用队列,因此磁盘可能会在我们的程序没有错误的情况下耗尽空间。处理这些问题可能会非常复杂,两种基本方法是将资源锁定一段时间,或者乐观地假设一个资源会成功,然后在以后失败时处理错误。您给出的示例是后者的示例,只是没有错误处理。在这种情况下的静默失败可能发生在忽略问题的真实系统中,并且它们被破坏了。