我从Everything2.com采用如下竞争条件定义:
竞争条件是运行多个并发进程的情况(出于这些目的,一个线程也被建模为一个进程,就像在不同机器上运行的进程一样)将给出不同的结果,具体取决于(未指定的,通常是未指定的)细节操作的顺序。
现在考虑第 3 章中的以下示例:竞争条件和互斥:
然而,最危险的竞争条件涉及对共享数据结构的访问。如果两个线程同时更新相同的数据结构,则更改可能部分由一个线程进行,部分由另一个线程进行。然后数据结构的内容可能会变得乱码,这将混淆稍后访问它的线程,从而导致它们崩溃。
显然,该样本包含有害的竞争条件。
有一种解决方案可以避免这种有害的竞争条件:
诀窍是强制线程一次访问一个数据结构,即所谓的互斥,这样每个线程都可以完成其更新并使结构保持一致状态以供下一个线程使用。
现在根据上述定义,上述解决方案中仍然存在竞争条件:
如果线程A先改变,那么共享数据结构的最终内容由线程B填充;如果线程 B 先进行更改,则共享数据结构的最终内容由线程 A 填充。
但现在它是一种无害的竞争条件。
从这个样本中,我得到以下结论:
竞争条件是有害的当且仅当它是可以避免的。
我不确定上述结论的两个方向或一个方向是否正确。那么有没有样本可以反驳这个结论呢?